4

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の内容を読み取ったり、適切に初期化したりするにはどうすればよいですか?

(これがどこかに説明されている場合は、参照を提供してください)。

4

2 に答える 2

2

簡単な方法は、「lfe」コマンドを使用して LFE スクリプトを実行することです。「lfe」は、スクリプトの実行に使用できるという点で「bash」と同様に動作します。bin/lfec で定義されている「lfec」スクリプトは、この良い例です。これは、引数を解析して LFE コンパイラを実行する LFE シェル スクリプトです。

于 2015-06-06T04:25:41.167 に答える