【问题标题】:Run erlang code from browser and get response?从浏览器运行 erlang 代码并获得响应?
【发布时间】:2013-10-12 00:20:23
【问题描述】:

你好很棒的社区!

我最近开始学习 erlang。 (这很令人费解):)

我似乎无法在任何地方找到答案....但作为一种学习方式,我正在尝试在我的网络浏览器中创建一个迷你 shell。

例如,我想在文本框中输入一些实际的 erlang 代码,按 Enter 键并返回结果并将其显示在网页上。

> Awesome = 41 + 41.
> io:format("Awesome = ~p", Awesome).
> 82

我已经在我的 localhost 上的 8891 端口上设置了一个简单的 erlang 服务器,并且可以轻松连接到它。 是否可以发送 erlang 代码来运行并输出响应?

任何帮助将不胜感激! :)

【问题讨论】:

    标签: shell browser erlang


    【解决方案1】:

    这可以使用link 中提到的 erl_scan、erl_parse、erl_eval 来实现。 问题在于变量绑定。在表达式中使用时需要知道变量绑定(在 fun 中更难)

    1> Expr="Awesome = 41 + 41.".
    "Awesome = 41 + 41."
    2> {ok, Tokens, _} = erl_scan:string(Expr).
    {ok,[{var,1,'Awesome'},
         {'=',1},
         {integer,1,41},
         {'+',1},
         {integer,1,41},
         {dot,1}],
        1}
    3> {ok, [Form]} = erl_parse:parse_exprs(Tokens).
    {ok,[{match,1,
                {var,1,'Awesome'},
                {op,1,'+',{integer,1,41},{integer,1,41}}}]}
    4> {value, Value, Binding} = erl_eval:expr(Form, []).
    {value,82,[{'Awesome',82}]}
    

    当用户在浏览器中输入Awesome = 41 + 41. 时,您可以将响应返回为 82。

    您还需要维护表达式的状态。也就是应该维护的Binding可以如下使用

    5> FunStr ="io:format(\"Awesome = ~p\", [Awesome]).".
    "io:format(\"Awesome = ~p\", [Awesome])."
    6> {ok, Tokens1, _} = erl_scan:string(FunStr).
    {ok,[{atom,1,io},
         {':',1},
         {atom,1,format},
         {'(',1},
         {string,1,"Awesome = ~p"},
         {',',1},
         {'[',1},
         {var,1,'Awesome'},
         {']',1},
         {')',1},
         {dot,1}],
        1}
    7> {ok, [Form1]} = erl_parse:parse_exprs(Tokens1).
    {ok,[{call,1,
               {remote,1,{atom,1,io},{atom,1,format}},
               [{string,1,"Awesome = ~p"},
                {cons,1,{var,1,'Awesome'},{nil,1}}]}]}
    8> {value, Fun1, _} = erl_eval:expr(Form, Binding).
    {value,82,[{'Awesome',82}]}
    
    9> {value, V, _} = erl_eval:expr(Form1, Binding).
    Awesome = 82{value,ok,[{'Awesome',82}]}
    

    绑定列表应该一直增长到会话结束。

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2012-02-12
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多