Erlang模块向shell程序发送和接收消息

时间:2014-04-14 18:51:47

标签: shell erlang erl

你好erlang社区!

我有

  • 一个从用户接收erlang代码的erlang模块,
  • 执行erlang表达式
  • 并将结果返回给用户。

有点像贝壳。除此之外,还有

  • 变量绑定
  • 或命令历史记录。

我想知道是否有完整而彻底的懒惰方式来实施绑定/历史记录:

  • 在后台打开一个erlang shell
  • 保持活力
  • 并与之沟通。

即。向shell发送命令,然后将结果发送回我的模块

我似乎找不到办法。

这可能吗?或者我注定要自己实施它?

谢谢:)

2 个答案:

答案 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).

希望这会有所帮助:)