3

こんにちは、素晴らしい erlang コミュニティです!

私が持っている

  • ユーザーから erlang コードを受け取る erlang モジュール、
  • erlang式を実行します
  • 結果をユーザーに返します。

貝殻みたいなやつ。を除いて、ありません

  • 変数バインディング
  • またはコマンド履歴。

次の方法でバインディング/履歴を実装するための完全で完全な怠惰な方法があるかどうか疑問に思っています。

  • バックグラウンドで Erlang シェルを開く
  • 生かしておく
  • そしてそれと通信します。

つまり、シェルにコマンドを送信すると、結果がモジュールに返されます

私は方法を見つけることができないようです。

これは可能ですか?それとも、自分で実装する運命にありますか?

ありがとう :)

4

2 に答える 2

1

erl_evalの erlang ドキュメントを読んだ後、自分のプロジェクトに適した解決策を思いつきました ( IPython の Erlang 言語カーネル)。他の誰かが同じ問題を抱えている場合に備えて、共有したいと思います。

変数バインディング

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}.

ここでは、コード(文字列) とバインディング(最初は空のリスト)を渡します。

この関数は、erlang 式とそのバインディングを実行します。次に、実行結果 (値) と変数バインディングの新しいリスト (古い変数バインディング + コード実行中に割り当てられた可能性のある新しい変数) を返します。

ここから、呼び出し元の関数からのコード実行とバインディングを追跡できるはずです。

コード履歴

コード履歴を実装したい場合は、コード変数を文字列のリストに変更できます。例えば:

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}.

execute 関数を呼び出す前に、実行するコードをCodeリストに追加する必要があります。

NewCodeList = lists:append(NewCode, OldCodeList),
% Execute code at head of list
{ok, Value, NewBindings} = execute(NewCodeList, Bindings).

お役に立てれば :)

于 2014-05-09T20:34:00.203 に答える
0

erlang-history erlang-historyを使用する必要があります

于 2014-04-14T19:52:26.187 に答える