【问题标题】:Erlang module to send and receive messages to shell programErlang 模块向 shell 程序发送和接收消息
【发布时间】:2014-05-28 21:01:42
【问题描述】:

你好很棒的 erlang 社区!

我有

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

有点像贝壳。除了,没有没有

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

我想知道是否有一种完整且完全懒惰的方式来实现绑定/历史记录:

  • 在后台打开一个 erlang shell
  • 让它活着
  • 并与之通信。

即向 shell 发送命令并将结果发送回我的模块

我似乎找不到办法。

这可能吗?还是我注定要自己实现?

谢谢:)

【问题讨论】:

    标签: shell erlang erl


    【解决方案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).
      

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-08
        • 2016-03-19
        • 2021-05-28
        • 2023-03-31
        • 2017-06-29
        • 2014-06-07
        • 2022-09-26
        • 2016-10-04
        相关资源
        最近更新 更多