Erlang 模块向 shell 程序发送和接收消息
Posted
技术标签:
【中文标题】Erlang 模块向 shell 程序发送和接收消息【英文标题】:Erlang module to send and receive messages to shell program 【发布时间】:2014-05-28 21:01:42 【问题描述】:你好很棒的 erlang 社区!
我有
一个从用户接收erlang代码的erlang模块, 它执行erlang表达式 并将结果返回给用户。有点像贝壳。除了,没有没有
变量绑定 或命令历史记录。我想知道是否有一种完整且完全懒惰的方式来实现绑定/历史记录:
在后台打开一个 erlang shell 让它活着 并与之通信。即向 shell 发送命令并将结果发送回我的模块
我似乎找不到办法。
这可能吗?还是我注定要自己实现?
谢谢:)
【问题讨论】:
【参考方案1】:你需要使用 erlang-history erlang-history
【讨论】:
【参考方案2】:在阅读了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).
希望这会有所帮助:)
【讨论】:
以上是关于Erlang 模块向 shell 程序发送和接收消息的主要内容,如果未能解决你的问题,请参考以下文章