Rに慣れるために、Lispインタプリタを書いてみました。
元ねたはPeter Norvigの (How to Write a (Lisp) Interpreter (in Python)) (日本語訳: ((Pythonで) 書く (Lisp) インタプリタ))です。
コード
遊び方
コードを取ってきます。
$ git clone https://gist.github.com/5598108.git
Rインタプリタを起動してコードを読み込ませます。
repl()
を実行するとLispの対話式インタプリタが起動します。
$ cd 5598108/ $ R -q > source("lisp.R") > repl() lisp.R> (+ 1 2) 3 lisp.R> (define l (list 1 2 3)) (1 2 3) lisp.R> (car l) 1 lisp.R> (cdr l) (2 3) lisp.R> (define add2 (lambda (x) (+ x 2))) #<closure> lisp.R> (add2 40) 42 lisp.R> (equal? (list 1 2) (list 1 (- 5 3))) TRUE lisp.R> (define map (lambda (f l) (if (null? l) (quote ()) (cons (f (car l)) (map f (cdr l)))))) #<closure> lisp.R> (map add2 (list 10 20 30)) (12 22 32) lisp.R>
感想
Rの言語機能(ファーストクラスの関数、レキシカルスコープ、クロージャなど)のおかげで、割と楽に書けたと思います。
ただリストの操作はちょっと面倒くさいかな、と思いました。
あと値渡しとか遅延評価とかでところどころはまりました。まだまだ慣れが必要です。
でも今回初めて使った機能がいくつかあって勉強になったし、何より言語処理系を作るのはとても楽しいです。
(追記)
続編を書きました。((Rで) 書く ((もっとRっぽい) Lisp) インタプリタ)
0 件のコメント:
コメントを投稿