在阅读了erl_eval 的 erlang 文档后,我想出了一个适合我的项目 (Erlang language kernel for IPython) 的解决方案。我想分享一下,以防其他人有同样的问题。
变量绑定
为了执行 erlang 代码,我创建了一个函数来执行此操作。同时跟踪变量绑定。
execute(Code, Bindings)->
{ok, Tokens, _} = erl_scan:string(Code),
{ok, [Form]} = erl_parse:parse_exprs(Tokens),
{value, Value, NewBindings} = erl_eval:expr(Form, Bindings),
{ok, Value, NewBindings}.
在这里,我传递了 code(字符串)和 bindings(以空列表开头)。
该函数执行 erlang 表达式及其绑定。然后它返回执行结果(值)和新的变量绑定列表(旧变量绑定 + 代码执行期间可能已分配的任何新变量)。
从这里,您应该能够跟踪调用函数的代码执行和绑定。
代码历史
如果您想实现 代码历史记录,您可以将 Code 变量更改为字符串列表。例如:
execute([Code|Tail], Bindings)->
{ok, Tokens, _} = erl_scan:string(Code),
{ok, [Form]} = erl_parse:parse_exprs(Tokens),
{value, Value, NewBindings} = erl_eval:expr(Form, Bindings),
{ok, Value, NewBindings}.
在调用执行函数之前,您显然必须将要执行的代码附加到 代码 列表中。
NewCodeList = lists:append(NewCode, OldCodeList),
% Execute code at head of list
{ok, Value, NewBindings} = execute(NewCodeList, Bindings).
希望这会有所帮助:)