clarification on single assignment
Robert Virding
rv@REDACTED
Thu Nov 30 11:22:46 CET 2000
Hakan Mattsson <hakan@REDACTED> writes:
>
>You mean as perverse as the spurious ';' separator? ;-)
Well, actually the semantics of the "spurious ';' separator" is quite
clear and consistent, it is a sequential or operator between clauses.
Perhaps you are referring to the fact that it is a separator and not a
terminator, personally I have never had any trouble with that.
I suppose we could make it a terminator if you really want, however,
if you are willing to go through all code and add one to each final
clause in every function definition and if/case/receive. :-)
Otherwise trying writing as I have seen Richard O'Keefe does:
case <expr> of
<pat1> -> ...
; <pat2> -> ...
; <pat3> -> ...
end,
which looks a little odd but is very logical. I don't think Erlang
mode supports it though.
>The semantics of the '=' operator depends of its context, but the '.'
>could not be reused as separator between function clauses!?
What is wrong with a whole function as one unit and not as a disjoint
collection of clauses? It is much clearer than allowing clauses to be
separated.
The trouble with generally using '.' as an operator is that it can
occur within a token, a float, and using it as operator can cause
confusion. Prolog has/had it as the list operator so you could write
a.b.c.d.[] instead of [a,b,c,d]. How do you parse 1.2.3.4.[]? Forcing
blanks occasionally sucks. (I know it is necessary now, but it still
sucks)
>Perverse or not, I think that the different semantics of the '='
>operator in its various contexts (match/assign), is a little bit
>confusing. The bad example below does not work as you already pointed
>out, but both the ugly ones does. It is not intuitive.
Yes, I know, '=' is used in three contexts:
Explicit match operator
Couple record field name to value/pattern
Aliases in patterns.
The trouble is that there is a limited number of symbols on the
keyboard so there will be overloading.
> ugly() ->
> B = #type{name = 3},
> fun(A = #type{name = Value}) -> Value end(B).
>
> ugly2() ->
> B = #type{name = 3},
> case B of
> A = #type{name = Value} -> Value
> end.
I personally can't conceive why anyone would write aliases in patterns
in that direction, I always do it the other way:
ugly() ->
B = #type{name = 3},
fun(#type{name = Value}=A) -> Value end(B).
Writing it this way means you have the same semantics as for a normal
explicit match, take the value of "A" and match it with the record ...
This then only gives two uses.
I was much to lenient with the syntax and didn't realise what people
would do with it. Though after all these years you would think that I
would learn. It ought to be changed. So remember:
ALWAYS WRITE PATTERN ALIASES AS <PATTERN>=<VAR>!!
Hmm, maybe lint should warn? :-)
Robert
More information about the erlang-questions
mailing list