Erlang——如何将fun()对象转换为字符串

Erlang——如何将fun()对象转换为字符串,erlang,Erlang,有没有一种简单的方法可以将Erlangfun转换为字符串?调用io_lib:format仅打印函数引用,例如“#Fun”。例如,我希望能够做到这一点: 1> Fun = fun() -> atom_to_list('hello world') end. 2> FunStr = fun_to_str(Fun). "fun() -> atom_to_list('hello world') end." 我正在寻找如何实现fun\u to\u str。在javascript中,

有没有一种简单的方法可以将Erlang
fun
转换为
字符串
?调用
io_lib:format
仅打印函数引用,例如
“#Fun”
。例如,我希望能够做到这一点:

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

我正在寻找如何实现
fun\u to\u str
。在javascript中,一些解释器有一个
.toSource()
函数,可以在任何对象上调用该函数,包括打印字符串表示的函数。非常感谢您提供的任何信息。

您可能可以使用erlang:fun\u 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>
1>erlang:fun\u info(fun()->test,ok end,env)。
{env,[[],
{价值,#乐趣},
{eval,#Fun},
[{子句,1,[],[],[{atom,1,test},{atom,1,ok}]}
2>

您需要最后一个包含atom子句的列表,然后使用例如erl_pp

漂亮地打印它。首先,获取用于娱乐的环境变量(包括抽象代码):

1>{env,[{{uu,{uu,{uu,Abs}]}=erlang:fun\u info(fun,env)。
{env,[{[],
{eval,#Fun},
{价值,#乐趣},
[{第1条,[],[],[],
[{call,1,{atom,1,atom_to_list},[{atom,1,hello_world}]}
使用
erl\u 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,{子句,…}}
,使其成为一个完整的Erlang表达式)

实际上,这非常有效,但有时我会编写一个非平凡的
fun
,并使用此方法将其转换为字符串,生成以下内容:
fun()->end
,无正文。你知道是什么导致了这一切吗?你说的一个不平凡的乐趣是什么意思?你能举个例子吗?任何有趣的事情,做一些内在的;我可以在shell中运行您的命令,它可以工作,但在我的程序中执行同样的操作却不行。
fun\u info
步骤除了
fun
end
之外,不返回任何标记,即使函数在语法上是正确的,并且已编译,并且编译代码中的所有fun只是对编译到模块中的隐藏函数的引用。您是否尝试过使用选项
debug\u info
编译模块?在17RC2上
+debug\u info
似乎没有任何改变。