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 程序发送和接收消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥代码版本控制器在 erlang 中不起作用?

在 Erlang 中发送/接收消息(并发)

Erlang 并发编程

Erlang消息发送和接收与多个进程

用erlang解析ejabberd数据包

DCM之诊断服务调度程序(DSD)详解一