从浏览器运行erlang代码并获得响应?

时间:2013-10-04 21:03:58

标签: shell browser erlang

你好,很棒的社区!

我最近开始学习erlang。 (这是非常精神弯曲):))

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

这可以使用此link中提到的erl_scan,erl_parse,erl_eval来实现。 问题出在变量绑定上。在表达式中使用时需要知道变量绑定(当它在有趣的时候更难)

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。

您还需要维护Expression的状态。也就是说应该保持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}]}

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