<br><div class="gmail_quote">On Tue, Jan 22, 2013 at 7:21 PM, Tyron Zerafa <span dir="ltr"><<a href="mailto:tyron.zerafa@gmail.com" target="_blank">tyron.zerafa@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">F = fun(X,Y) -> X+Y end,<div><div><br></div><div>In the above statement, F is just a function reference. Can I get the syntax, code tree or anything else from this variable? All I need is to extract the syntax out of a function reference. Any ideas how I can achieve this?</div>


</div><div><br></div><div>The following convert a fun string into an actual fun. I need something the other way round, any ideas ??</div><div><br></div><br></div></blockquote><div><br>Hello!!<br><br>Although I am not sure, I believe that such information may be impossible to retrieve from the bytecode of a compiled module.<br>

Having said that, I think that the important question is whether you have access to<br>a) the source code of the module or<br>b) a compiled version of the module with debug_info.<br>In both cases you can generate the Abstract Syntax Tree and then extract the desired expression that corresponds to the body of the lambda function.<br>

<br>However, if what you want is something more like the result of erlang:fun_info/1, things may be somewhat tricky.<br>Consider the following example:<br><br>


<style type="text/css">
span {
        font-family: 'Courier New';
        font-size: 10pt;
        color: #000000;
}
.sc0 {
}
</style>


<div style="float:left;white-space:pre;line-height:1;background:#ffffff"><span class="sc0">1> X = 42.
42
2> F = fun(Y) -> X + Y end.
#Fun<erl_eval.6.31705386>
3> proplists:get_value(env, erlang:fun_info(F)).
[[{'X',42}],
 {value,#Fun<shell.7.20862592>},
 {eval,#Fun<shell.24.20862592>},
 [{clause,1,
          [{var,1,'Y'}],
          [],
          [{op,1,'+',{var,1,'X'},{var,1,'Y'}}]}]]
<br><br></span>The value associated with the key <span style="font-family:courier new,monospace">env</span> of the returned proplist also contains the environment (namely X = 42) in which the function must be evaluated.<br>

This information is not stated explicitly in the AST so if you want it you'll have to parse the expression and locate the variables of the outer environment.<span class="sc0"><span style="font-family:arial,helvetica,sans-serif"><br>

<br>Here's an example of the resulting AST of a lambda function</span></span><span class="sc0"><span style="font-family:arial,helvetica,sans-serif">

</span></span><div style="float:left;white-space:pre;line-height:1;background:#ffffff"><span class="sc0">Erlang Code:
bar(X) ->
  F = fun(Y) -> X + Y end,
  F(42).
  
AST of F
{'fun',5,
   {clauses,[{clause,5,
                 [{var,5,'Y'}],
                 [],
                 [{op,5,'+',{var,5,'X'},{var,5,'Y'}}]}]}}}<br><br><span style="font-family:arial,helvetica,sans-serif">I hope I gave you some ideas!!<br><br>Aggelos<br></span></span></div><span class="sc0"><span style="font-family:arial,helvetica,sans-serif"> <style type="text/css">span {
        font-family: 'Courier New';
        font-size: 10pt;
        color: #000000;
}
.</style></span></span></div></div></div>