Erlang - Как преобразовать объект fun () в строку - PullRequest
13 голосов
/ 09 марта 2011

Есть ли простой способ конвертировать 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 ]

16 голосов
/ 09 марта 2011

Сначала получите переменные окружения для развлечения (включая абстрактный код):

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, ...}} вокруг него, чтобы сделать его полным выражением Эрланга)

3 голосов
/ 09 марта 2011

Вы могли бы использовать erlang: fun_info / 2 для этого, по крайней мере, я получаю некоторую информацию из оболочки при выполнении

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>

Вы хотите последний список с атомом предложения и затем довольно распечатываете егоиспользуя, например, erl_pp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...