((Rで) 書く (Lisp) インタプリタ)の続きです。
以前の記事を見た@kohskeさんから、 環境はRの環境オブジェクトを使えば良いのでは、とアドバイスを頂きました。
やってみたら自前で環境を実装しなくて良い分簡潔になったし、より面白い使い方ができるようになりました。
コード
前回同様Gistに上げておきました。 変なところがあったら教えてください。
主な変更点は
- Rの環境オブジェクトを流用
- Lispの関数の呼び出し方法を変更: proc(exps) から do.call(proc, exps) に
遊び方
前回と同様です。
Rインタプリタを起動してコードを読み込ませます。
repl()
を実行するとLispの対話式インタプリタが起動します。
$ ls lispr.R $ R -q > source("lispr.R") > repl() lispr> (+ 1 2) 3 lispr> (define add2 (lambda (x) (+ x 2))) #<closure> lispr> (add2 40) 42 lispr>
関数 repl
の引数 parent
に渡した環境がLispの環境の親になります。(デフォルトだとRのグローバル環境)
よって今回はLispの環境からRの環境を参照できるので、LispでRの関数が使えます。
lispr> (: 1 10) 1 2 3 4 5 6 7 8 9 10 lispr> (rnorm 3) 0.536481224524994 -0.547993231580984 -2.14041393248752 lispr> (seq 0 10 2) 0 2 4 6 8 10 lispr> (begin (plot cars) (lines (lowess cars)) 1) 1 lispr>
S式でRを使える!楽しい!
感想
やはり言語処理系を作るのは楽しいです。