clarification on single assignment

Hakan Mattsson <>
Fri Nov 24 13:22:34 CET 2000


On Fri, 24 Nov 2000, Robert Virding wrote:

rv> DON'T confuse the '=' in records with the match operator, all it does 
rv> is couple a field name with a value/pattern.  You could use any 
rv> symbol there, for example B#type{name |-| 3} or, if you are really 
rv> perverse, B#type{name should be coupled to 3}.

You mean as perverse as the spurious ';' separator? ;-)

The semantics of the '=' operator depends of its context, but the '.'
could not be reused as separator between function clauses!?

rv> So this means that in your last example what you are trying to do is:
rv> 
rv> B = #type{name = 3},
rv>	    Create a record of type #type where field 'name' has value 3
rv>	    and bind B to the record.
rv> A = B#type{name = Value},
rv>	    Create a copy of the value of B where field 'name' now has the
rv>	    value of the unbound variable Value.
rv> Value
rv>	    Return the value of the unbound variable Value.
rv> 
rv> Which, of course, according to the rules does not work.  The first 
rv> example, of course, works because you bind the variables before you use 
rv> them.

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.

    -module(equal).
    -compile(export_all).
    -record(type, {name}).
    
    good() ->
	Value = 3,
	B = #type{},
	A = B#type{name = Value}.
    
    %% bad() ->
    %%     B = #type{name = 3},
    %%     A = B#type{name = Value},
    %%     Value.
    
    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.

/Håkan





More information about the erlang-questions mailing list