Erlang アプリケーションのスクリプト拡張言語としてLisp Flavored Erlangを使用したいと考えています。必要に応じて、同様の方法でGNU EmacsをEmacs Lisp経由で構成および拡張します。
私は、議論が幅広く構造化されていることを知っています。しかし、この質問の特定のケースでは、Erlang コードから LFE で定義されたバインディング名(または必要に応じて変数)を読み取れるようにしたいと考えています。
私はLFE内部アーキテクチャ (ソフトウェア エンジニアリングと Erlang プログラミングの優れた例)の専門家ではありませんが、ソースにもドキュメントにも答えを見つけることができませんでした。ソースを見ると、LFE にはErlang VMを対象とするコンパイラとインタプリタの両方が含まれていることがわかります。後者は私が使用しようとしているものです。
LFE インストール パス (私のシステム上) でErlang shell/ REPL$HOME/opt/lfe
を起動すると:
$ cd /path/to/LFE-install-dir
$ erl -pa ./ebin
私は値を計算することができます:
1> {ok, Expr} = lfe_io:read_string("(+ 1 10)").
{ok,['+',1,10]}
2> Result = lfe_eval:expr(Expr).
11
これは最初のステップですが、私が望んでいるものとはまったく異なります。変数をバインドしてその値を読み取りたいと思います。それが私の問題です:
3> {ok, Expr2} = lfe_io:read_string("(set a 10)").
{ok,[set,a,10]}
4> lfe_eval:expr(Expr2).
** exception error: {unbound_func,{set,2}}
in function lfe_eval:eval_expr/2
set
がバインドされていない関数として認識されるのはなぜですか? LFE REPL では、次の式が有効です。
Erlang/OTP 17 [erts-6.4] [ソース] [64 ビット] [smp:4:4] ... LFE Shell V6.4 (^G で中止) > (10 を設定) 10 > 10
私は明らかに API を間違った方法で使用しています。LFE インタープリターa
の内容を読み取ったり、適切に初期化したりするにはどうすればよいですか?
(これがどこかに説明されている場合は、参照を提供してください)。