Erlang - 如何将fun()对象转换为String

时间:2011-03-09 18:43:09

标签: erlang

是否有将Erlang fun转换为string的简单方法?对io_lib:format的调用仅打印功能参考,例如像"#Fun<erl_eval.20.67289768>"这样的东西。例如,我希望能够这样做:

1> Fun = fun() -> atom_to_list('hello world') end.
2> FunStr = fun_to_str(Fun).
"fun() -> atom_to_list('hello world') end."

我正在寻找如何实施fun_to_str。在javascript中,一些解释器具有.toSource()函数,可以在打印其字符串表示的任何对象(包括函数)上调用。任何信息都表示赞赏,谢谢。

2 个答案:

答案 0 :(得分:16)

首先,获取有趣的环境变量(包括抽象代码):

1> {env, [{_, _, _, Abs}]} = erlang:fun_info(Fun, env).                     
{env,[{[],
       {eval,#Fun<shell.21.83096281>},
       {value,#Fun<shell.5.83096281>},
       [{clause,1,[],[],
                [{call,1,{atom,1,atom_to_list},[{atom,1,hello_world}]}]}]}]}

使用erl_pp

打印抽象代码
3> Str = erl_pp:expr({'fun', 1, {clauses, Abs}}).           
[[[["fun",
    [[[[["()"]," ->"],
       ["\n       ",
        [["atom_to_list",[[40,["'hello world'",41]]]]]]]]]]],
  [10,["end"]]]]
4> io:format([Str|"\n"]).
fun() ->
       atom_to_list('hello world')
end
ok

(您必须在其周围添加{'fun', 1, {clauses, ...}}以使其成为完整的Erlang表达式)

答案 1 :(得分:3)

您可以使用erlang:fun_info / 2,至少我在执行时从shell获取一些信息

1> erlang:fun_info(fun() -> test,ok end, env).
{env,[[],
     {value,#Fun<shell.7.37281544>},
     {eval,#Fun<shell.24.85590193>},
     [{clause,1,[],[],[{atom,1,test},{atom,1,ok}]}]]}
2>

你想要带有子句atom的最后一个列表然后使用例如erl_pp

打印它