Sometimes I miss destructively updating local variables

James Hague <>
Thu Jul 20 16:57:58 CEST 2006


Thanks for all the interesting replies to this.  I gave them all some
thought and continued to mull over the problem.  What it comes down to
for me is that Erlang/BEAM handles destructive updates extraordinarily
well behind the scenes.  Records and dicts are fine, but they bypass
the beauty of the current system.  Just list all variables in a
function, and update them as needed in a tail call.  I think lots of
people don't realize that in a function like this:

f(A,B,C,D,E,F,G,H,I,J) ->
   f(A,B,C,D,E,F+1,G,H,I,J);
[...]

essentially turns into this code:

f:
   parameter(5) += 1
   goto f

What would be nice is to have a syntax similar to that of records,
where one lists the changes to the parameter list.  Let's say that "@"
means "tail call," so in this example we'd have:

f(A,B,C,D,E,F,G,H,I,J) ->
   @(F -> F + 1);

Ignoring the syntactic details, I really like this.  It's simple,
clean, and leads to code that's very tight in terms of source and
object code.  It's also easy to write a short Perl script to take a
function in the above format and expand the "@" syntax.  (It's a
little trickier than it needs to be, because parameters like [H|T]
need to look like [H|T]=L, but this wouldn't be needed with native
support.)



More information about the erlang-questions mailing list