你好erlang社区!
我有
有点像贝壳。除此之外,还有否
我想知道是否有完整而彻底的懒惰方式来实施绑定/历史记录:
即。向shell发送命令,然后将结果发送回我的模块
我似乎找不到办法。
这可能吗?或者我注定要自己实施它?
谢谢:)
答案 0 :(得分:0)
您需要使用erlang-history erlang-history
答案 1 :(得分:0)
在阅读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}.
在这里,我传递了代码(字符串)和绑定(开头的空列表)。
该函数执行erlang表达式及其绑定。然后它返回执行结果(值)和新的变量绑定列表(旧变量绑定+在代码执行期间可能已分配的任何新变量)。
从这里开始,您应该能够跟踪调用函数的代码执行和绑定。
如果您想实施代码历史记录,可以将代码变量更改为字符串列表。例如:
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).
希望这会有所帮助:)