<div class="gmail_quote">On Wed, Mar 28, 2012 at 4:51 PM, Yoshihiro Tanaka <span dir="ltr"><<a href="mailto:hirotnkg@gmail.com">hirotnkg@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hello,<br>
<br>
I have a function which returns fun as below:<br>
<br>
make_fun(_, [], F) -> F;<br>
make_fun(Operator, [Operand1, Operand2|Operands], F) -><br>
  F2 = case Operator of<br>
         plus  -> fun() -> Operand1 + Operand2 + F() end;<br>
         minus -> fun() -> Operand1 - Operand2 + F() end<br>
       end,<br>
  make_fun(Operator, Operands, F2).<br>
<br>
When I call it as:<br>
F1 = make_fun(plus, lists:seq(1,10), fun() -> 0 end).<br>
<br>
Is F1 same as F2 below ?<br>
F2 = fun() -> 1 + 2 +<br>
       fun() -> 3 + 4 +<br>
         fun() -> 5 + 6 +<br>
           fun() -> 7 + 8 +<br>
             fun() -> 9 + 10 +<br>
               fun() -> 0 end()<br>
             end()<br>
           end()<br>
         end()<br>
       end()<br>
     end.<br></blockquote><div><br></div><div>No, F1 is not the same as F2. A function F is a function definition, then</div><div>F() is a function application. The F1 shell be expand as </div><div><br></div><div>(fun() -></div>
<div>    9 + 10 +</div><div>   (fun() -></div><div>        7 + 8 +</div><div>       (fun() -></div><div>           5 + 6 +</div><div>          (fun() -></div><div>              3 + 4 +</div><div>             (fun() -></div>
<div>                1 + 2 + (fun() -> 0 end)()</div><div>              end)()</div><div>          end)()</div><div>      end)()</div><div>  end)()</div><div>end)</div><div><br></div><div>All F() evaluates itself, but F doesn't. Functions applied can be reduced,</div>
<div>and F1 is reduced as a form</div><div><br></div><div><div>(fun() -></div><div>    9 + 10 +</div><div>     (7 + 8 +</div><div>        (5 + 6 +</div><div>           (3 + 4 +</div><div>              (1 + 2 + 0)</div>
<div>     )  )  )</div><div>end)</div></div><div><br></div><div>Note that it cannot be a function with any binary operator + accompanied</div><div>by a function definition. For example, try to write a program with you</div>
<div>make_fun/3 definition, and make the F1 function in Erlang shell. And</div><div>give following instructions:</div><div><br></div><div>          F3 = fun()-> 1 + 2 + F1 end, F3().</div><div><br></div><div>You will get a bad argument error in arithmetic expression. Obviously</div>
<div>in your make_fun/3, every time it make a fun() -> end expression,</div><div>it evaluates a preceding function and puts the result as an operand of +,</div><div>and the preceding function is not a function definition any more.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Also, is there any difference between funs that are defined at runtime<br>
and funs that are defined at compile time in terms of how they are<br>
executed ?<br>
<br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thank you<br>
Yoshihiro<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div><br></div>Best Regards.<div><br></div><div>--- Y-H. H.</div><div><br></div><br>