Я хотел бы отметить, что ответ Зеда создает интерпретированное веселье. Когда вызывается веселье, оно входит в оценщик, который начинает оценивать абстрактное синтаксическое дерево, возвращаемое erl_parse:parse_exprs/1
, которое он захватил. Глядя на созданное веселье:
11> erlang:fun_info(Fun, env).
{env,[[],none,none,
[{clause,1,
[{var,1,'X'}],
[],
[{op,1,'+',{var,1,'X'},{integer,1,1}}]}]]}
12> erlang:fun_info(Fun, module).
{module,erl_eval}
Можно видеть, что оно закрылось по синтаксически проанализированному абстрактному синтаксическому дереву, как видно из информации env
, и это забавное создание внутри erlang_eval, как видно из информации module
.
Возможно использовать компилятор erlang для создания скомпилированного модуля во время выполнения, и указатель на это compile: forms / 2 и code: load_binary / 3 . Но детали этого, вероятно, должны перейти к другому вопросу, связанному со стековым потоком.