[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: expressions vs. statements
Ooops,
I guess I am unfamiliar with this netiquette. I certainly was not upset
or annoyed in any way -- sorry if I my usage here signaled the wrong
message.
I was not using the "quotes" and *items* except for emphasis to help
them stand out like italicized text. My usage was not meant to be
anything like shouting (SHOUTING?).
-- Dave S. [SmallScript LLC]
SmallScript for the AOS & .NET Platforms
David.Simmons@SmallScript.com | http://www.smallscript.org
> -----Original Message-----
> From: owner-ll1-discuss@ai.mit.edu
[mailto:owner-ll1-discuss@ai.mit.edu]
> On Behalf Of kragen@pobox.com
> Sent: Thursday, December 20, 2001 12:23 AM
> To: ll1-discuss@ai.mit.edu
> Subject: Re: expressions vs. statements
>
> David Simmons writes:
> > I hear the expression of major concern or conclusions about the
negative
> > aspects/inherent problems in languages that do not have what are
being
> > termed "statements" that do not evaluate to a "value".
>
> Boy, everybody's so TOUCHY here. It's not as if we're accusing each
> other of having bad breath or poor armpit hygiene. We're just talking
> about advantages and disadvantages of particular programming languages
> and programming language features here. No need to start bouncing off
> the walls and "using" scare "quotes". Take two Perls and call me in
> the morning.
>
> > However, of all the (many) things people have complained or been
> > concerned about in Smalltalk. I have never (not once) heard this
> > (everything has a value, there are no "statement" distinctions) as
being
> > a problem in Smalltalk where every operation is effectively a
message
> > and thus every operation has a "value".
>
> The particular problem I brought up, which Pixel corroborated, is that
> a function in Perl or C whose primary purpose is to have side effects
> nevertheless returns a value, the value of the last expression it
> evaluates. So you need to be careful about changing the last
> expression a Perl or C function evaluates, because you might break
> things accidentally.
>
> I don't think that's debatable, and I don't think it's debatable that
> that's a problem. It's debatable how big a problem it is; I think
> it's not a very big problem. In fact, I don't know where I'd look for
> a piece of code that exhibits it. But I know I've run into it in the
> past.
>
> I don't really know Smalltalk, but it seems to me that in Smalltalk,
> this dubious feature is completely absent. It's true that blocks
> return the value of their last expression, but blocks are different
> from functions; the closest analogue to a function in Smalltalk is a
> method. Methods are not blocks. They do not return the last
> expression evaluated. If they do not explicitly return a value with a
> ^ statement (maybe there's some Algolish spelling of this too, like :=
> for _?) they return the object they are being invoked on.
>
> It appears to me that in Smalltalk, blocks are used differently from
> functions. You can generally tell from the context where a block is
> defined whether it is intended to yield a useful value or not, and if
> you change your mind about whether or not it should, you generally
> only have to make local changes.
>
> > I surmise this has more to do with [how Smalltalk programmers are
> > industrious wizards who focus on the right things and love their
> > mothers]...
>
> I don't really think that's relevant to this discussion. I think it's
> purely explicable in terms of language semantics.
>
> Michael Fischer writes:
> > You already know that a function or block "returns" the last
> > statement contained within it. So why would you ask Perl to do what
> > you did not want it to do?
>
> Because it's shorter and clearer to ask Perl to do that.
>
> The point is that you didn't explicitly ask for anything, and when you
> don't explicitly ask for anything, Perl does something anyway, just in
> case it was what you wanted. You wrote a function that said:
>
> sub frotz {
> my ($wibble, $gurble) = @_;
> $wibble->frob('frotzed', $gurble);
> }
>
> and frotz ended up returning whatever $wibble->frob returned, and some
> code (possibly your own) may be depending on frotz returning this
> value. You can't tell by looking. You can avoid this as follows:
>
> sub frotz {
> my ($wibble, $gurble) = @_;
> $wibble->frob('frotzed', $gurble);
> return;
> }
>
> But that's verbose and ugly, extra work to write and to read, so
> people don't do that. It's not usually worth the effort for the tiny
> advantage it provides.
>
> Note that this is not a problem at all if you write functions whose
> purpose in life is to perform side effects. It's obvious from looking
> that the function's return value is used: if it weren't, there'd be a
> comment to that effect. It's only in languages like Perl, which
> support both imperative and functional programming very effectively,
> that you have a problem.
>
> Michael Fischer quoted Pixel:
> > > agreed for while/for. My only problem is with if_then_else which
> > > return value is useful. Alas in perl you can't write "return if ()
> > > ..." to disambiguate.
> >
> > No?
> >
> > return if $bar; # returns the special 'undef' value
>
> No. You can't write return if ($a) { $x } else { $y }, to make it
> clear that you're returning the return value of the if statement.
> Trailing statement modifiers are not the same thing, although I know
> that's what it sounded like Pixel was talking about. But you *can*
> write it in any of these ways:
>
> The C approach:
> return $a ? $x : $y; # (if $x and $y are expressions, not statements)
>
> The Python or Pascal approach:
> if ($a) {
> return $x;
> } else {
> return $y;
> }
>
> The do approach:
> return do { if ($a) { $x } else { $y } };