[erlang-questions] scope of variables

Richard Carlsson <>
Mon Sep 4 13:15:09 CEST 2006

Vlad Dumitrescu wrote:
> On 9/4/06, Richard Carlsson <> wrote:
>> and perhaps define macros that use such lambdas:
>> -define(let(X, Y, Z), ((fun (X)-> Z end)(Y))).
> Is it really that simple? This doesn't make for hygienic macros, and
> this will fail with a badmatch:
> foo() ->
>    A = 2,
>    ?let(X, 3, begin A=1, X+A end).

Yes, but that is not so strange. The macro does not create a completely
blank scope (it would be pretty useless if you could not import any
existing bindings). If you rewrite your example like this, there
is no problem:

foo() ->
    A = 2,
    ?LET(A, 1, ?LET(X, 3, X+A)).

(which returns 4, not 5).

So, how is that not hygienic?

> Oh, so even anonymous funs can be inlined? That's interesting!

Yes, the inliner does not really see a difference between normal
functions and anonymous funs. In both cases, it's just a functional
value bound to a name, and both can be inlined equally well.
The Core Erlang code produced for the function foo() above,
when using -compile(inline), is simply:

'foo'/0 = fun () -> 4

(This is Core Erlang syntax for "foo() -> 4" - it does not
mean that a fun-object will be created.)


More information about the erlang-questions mailing list