[erlang-questions] How do funs work ?

Yoshihiro Tanaka <>
Fri Mar 30 07:05:32 CEST 2012


2012/3/29 黃耀賢 (Yau-Hsien Huang) <>:
> 2012/3/30 Yoshihiro Tanaka <>
>>
>> Hi Yau-Hsien,
>>
>> It seems like not. For example, below example indicates F is not
>> evaluated when constructing F2.
>>
>> 1> F = fun() -> blah end.
>> #Fun<erl_eval.20.21881191>
>> 2> F2 = fun() -> 1 + 2 + F() end.

This example was not helpful to check if F is executed when
constructing F2. I think I should have written as:

2> EvalCheckFun = fun() -> 1 + 2 + fun() -> io:format("blah~n"), blah end() end.
#Fun<erl_eval.20.21881191>
3> EvalCheckFun().
blah
** exception error: bad argument in an arithmetic expression
     in operator  +/2
        called as 3 + blah

>
>
> No. Here you type F() which means F is evaluated when F2 is evaluating.
> I said the word "evaluated" but "reduced."
>
> If you expand the symbol 'F' to the function, in syntax, it must be
>     F2 = fun() -> 1 + 2 + (fun -> 0 end)() end.
> but
>     F2 = fun() -> 1 + 2 + (fun() -> 0 end) end.
> Later one is depicted in your original letter, then I point the difference

Maybe I'm not understanding something, but I can not find it. Could
you point that line in my original post ?
My current understanding is when I write like below, the part '(fun ->
0 end)()' is not evaluated/executed yet when F2 is bound, and it will
be evaluated when F2 is evaluated as F2().

F2 = fun() -> 1 + 2 + (fun -> 0 end)() end.

Is this understanding different from yours ?



> on parenthesis after. Maybe it's ill-wording, that it ought to be function
> application
> for symbol 'F()' and function-taking for symbol 'F'.
>
>
>> #Fun<erl_eval.20.21881191>
>> 3> F2().
>> ** exception error: bad argument in an arithmetic expression
>>     in operator  +/2
>>        called as 3 + blah
>>
>> I also checked core file of sample code, using 'to_core' option, and the
>> code:
>> 18           fun() -> 9 + 10 +
>> 19             fun() -> 0 end()
>> 20           end()
>
>
> The part of the core file seems as what I mentioned. :)
>
>>
>> is translated to:
>> %% Line 18
>> ( fun () ->
>>      let <_cor0> =
>>    %% Line 19
>>    ( fun () ->
>>    0
>>      -| [{'id',{2,100470014,'-make_fun2/0-fun-0-'}}] )
>>      in  let <_cor1> =
>>        %% Line 19
>>        apply _cor0
>>      ()
>>    in  call 'erlang':'+'
>>      (19, _cor1)
>>  -| [{'id',{3,119737161,'-make_fun2/0-fun-1-'}}] )
>>
>> It defines <_cor0>, as fun() -> 0 end, then doing 'apply _cor0'. So
>> It's calling fun _cor0.
>>
>>
>> Yoshihiro
>>
>>
>>
>> >
>> >>
>> >> Also, is there any difference between funs that are defined at runtime
>> >> and funs that are defined at compile time in terms of how they are
>> >> executed ?
>> >>
>> >> Thank you
>> >> Yoshihiro
>> >>
>> >> _______________________________________________
>> >> erlang-questions mailing list
>> >> 
>> >> http://erlang.org/mailman/listinfo/erlang-questions
>> >
>> >
>> >
>> >
>> > --
>> >
>> > Best Regards.
>> >
>> > --- Y-H. H.
>> >
>> >
>
>
>
>
> --
>
> Best Regards.
>
> --- Y-H. H.
>
>



More information about the erlang-questions mailing list