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).
お役に立てれば :)