[erlang-questions] Reassigning variables

Richard O'Keefe ok@REDACTED
Wed Mar 18 04:52:43 CET 2009

On 18 Mar 2009, at 3:52 pm, Matthew Dempsky wrote:

> On Tue, Mar 17, 2009 at 7:38 PM, Richard O'Keefe <ok@REDACTED>  
> wrote:
>> _Easier_ to analyse?  I'd love to see an example.
> Sorry, by analyze, I meant review for correctness, and I was referring
> specifically to the diff.  It's easier to review
> + r(X) = foo(X),
> than
> - X2 = bar(X1),
> - X3 = baz(X2),
> - xyzzy(X3).
> + X2 = foo(X1),
> + X3 = bar(X2),
> + X4 = baz(X3),
> + xyzzy(X4).

Fair enough.  The ?let macro would have precisely the same
advantage, with no parse transform required.
>> This is a very familiar pattern from Smalltalk.
>> But surely you don't need a 'return' for that.
> Of course I don't *need* it, it works currently without that.  But I
> also don't *need* comments or variable and function names with vowels,
> but I find them handy in making the code more understandable
> sometimes.

I meant "but surely you do not need 'return' to do that READABLY."
Yes you DO need function names with vowels and you DO need comments
in order to write non-trivial working programs, let alone readable
ones.  But you don't need multiple returns.

>> There's an EEP to allow "un-nested" cases.
> Hm.  It feels immediately ugly, but so did Erlang's syntax in general
> when I first used it.  (I'm not a fan of putting the semicolons on the
> start of lines though.)

If you care about readability, you should be.  I find non-trivial
case expressions in Erlang almost totally unreadable with the
semicolons on the right.  In C/C++/Java/C#, you have 'case' at the
beginning of a line to tell you when a new case begins.  In Ada,
you have 'when'.  In PL/I, you have 'WHEN'.  The same kind of thing
applies in Fortran.  Something on the left to tell you a new choice
is beginning is enormously helpful.  Erlang-with-semicolons-on-the-
right completely lacks that visual cue.

I developed this style in Prolog after reading Peter van Roy's
thesis where he raged against Prolog for using both ',' and ';'
which were very hard to tell apart at the end of a line.  The
obvious answer was "don't put them both at the ends of lines
then".  Even with better fonts, it is very very helpful.  I grant
you that it isn't *familiar*, and I even grant that a keyword
would be a better cue than a semicolon.  But it's a big step
forward in readability while sticking within the language we have.

As for un-nested cases, it's so very close to being the kind
of if-then-elif-then-elif-then-else-fi that people have been
asking for in Erlang for a long time, that it's really very
amusing to have it called "immediately ugly".  I guess that's
a vote for the language we have.

>> Absent that, I'd probably do
>>        case { requested_ad_size(...)
>>             , ad_status(...)
>>             , game_filtering(...)
>>             }
>>          of {bad,_,_}      -> {skip, bad_size}
>>           ; {_,disabled,_} -> [skip, disabled}
>>           ; {_,_,filtered} -> {skip, domain_filtered}
>>           ; _ ->
>>             choose_ad()
>>        end
>> Admittedly, this evaluates all the criteria, but then,
>> in what we are expecting to be the usual case, we're
>> going to do that _anyway_.
> Sure, but in other use cases, the second or third checks being valid
> depend on the first or second checks passing.

First, there is no reason to expect one code style to cover all
possible cases.  I was aware of that issue when I wrote this
example.  Second, it's actually not hard at all to work around
that.  But third,

	"Bombinating in a vacuum" is bootless.
	We need REAL code to discuss.

For example, in cases where the second and/or third checks might
depend on the first, it might be possible to fuse the checks so
that this does not apply.

> There are other reasons I don't like the case expressions.

Reasons are what debate thrives on.

More information about the erlang-questions mailing list