The formal answer is, of course, that Foo#foo.ref is an expression and the LHS of '=' must be a pattern. '=' is a pattern matching operator, not assignment. The easiest way to understand this is to view '=' as a shorthand for a case expression.
<br><br>What exactly were you trying to do? Set a field in Foo, or test if the ref fields in Foo and Bar are equal? In the second case it should be '==' instead.<br><br>If it's the first case then you have hit upon the reason why the syntax to modify a field in a record is the way it is. Trying to come up with a way to use '=' directly just does not work without changing the meaning of '=' or have destructive data structures.
<br><br>So if you would like to change a record field using a syntax like:<br><br>    Foo#foo.ref = 5<br><br>what would it mean?<br><br>- Change the 'ref' field of the 'foo' record in Foo to the value 1, i.e
. do a destructive update.<br>- Create a new 'foo' record from the one in Foo with the 'ref' field now has value 1 and put the new record in Foo. I.e. change the value of the variable Foo.<br>- Create a new record from the one in Foo and put the value ... . Well where? 
I.e. change the meaning of '=' for this special case. You could then do<br><br>    Foo1 = Foo#foo.bar = 1    %%Try explaining this<br><br>(Which is close to what we have today: Foo1 = Foo#foo{bar=1})<br><br>So all this means that you need a syntax for an expression which takes a record and returns it with a field which has a new value. Now I agree that the current syntax might not be very good but I have not seen a better alternative which is consistent with the rest of language.
<br><br>By the way, this is exactly the same reason why there isn't a shorter syntax for accessing a tuple element and using it for setting an element with a '=', for example:<br><br>Tuple{3} and Tuple{3} = new_value
<br><br>We need a set_element for just this reason. Or perhaps Tuple{3=new_value}. :-) It would be consistent.<br><br>In retrospect it would probably have been better NOT to use '=' as the match operator but have taken something else. '=' is just too deeply ingrained in most programmers as an assignment so many things look strange from that perspective. Just read the beginner's tutorial bloggs when they try to explain this.
<br><br>Yes, it has ALWAYS been this way.<br><br>Yes, there should probably be more discussion in the documentation about the implications of non-destructive data structures, variables which aren't and their implication on syntax.
<br><br>Robert<br><br><div><span class="gmail_quote">On 31/12/2007, <b class="gmail_sendername">Vance Shipley</b> <<a href="mailto:vances@motivity.ca">vances@motivity.ca</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
This suprised me, has it always been this way?<br><br>     5> Foo#foo.ref = Bar#bar.ref.<br>     ** 1: illegal pattern **<br><br>     6> F = Foo#foo.ref.<br>     1<br>     7> B = Bar#bar.ref.<br>     1<br>     8> F = B.
<br>     1<br><br>--<br>        -Vance<br>_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br><a href="http://www.erlang.org/mailman/listinfo/erlang-questions">
http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><br>