Lisp interpreter

素直に Lisp interpreter から実装してみた。http://www.csg.is.titech.ac.jp/~chiba/lecture/os/index.html の講義資料をほとんどそのまま。やっぱりインタプリターとは言えちゃんと順番にやってみるもんだ。とにかく自分には謙虚さが足りない。スキルも謙虚さも足りないおっさんというのは実に良くない。猛省。
LispUser.net さんの 超やさしいLispインタプリタの作り方 http://lispuser.net/memo/lisp/2007-02-25-22-54.html の意味がようやくかなり正確に分かるようになった。

いろいろな人が沢山実装しているので、あまり面白みのあるものは作れないが、なるべく Common Lisp をまねよう。
(Common Lisp が仕様に持つ) compile を実装するとちょっと面白いし、Common Lisp の理解も深まるだろう。Common Lisp 処理系が実際上コンパイラそのものであるということが分かると予想。

シンボルは HyperSpec をながめながらこのような構造体として定義。

(defstruct sym
  "symbol structure"
  name
  package
  value
  function)

途中は講義資料そのものなので省略。まだ環境とスコープ、パッケージの関係が若干怪しいが、コンパイラにするときまでには明らかになるだろう。
評価した内容をいちいち出力する eval-body というマクロを作って評価すると、以下のようになる。ちゃんと値と関数を同時に持てる。

toy(30): (eval-body 
	  (define foo 12)
	  (defun foo (x) (+ x 1))
	  (foo foo))

foo 
foo 
13 
toy(34): (eval-body 
	  (define x 5)
	  (defun f (x) (* x 2))
	  (defun g (x) (+ x 1))
	  (f (g x)))
x 
f 
g 
12 

フィボナッチ数列も遅いけどちゃんと動作。

(eval-body 
 (defun fib (n)
  (if (< n 2)
     n
   (+ (fib (- n 1)) (fib (- n 2)))))
 (fib 10))
fib
55

20080315 追記。
個人的には使ったことないけど、 property list というのがシンボルにはついている。

(defstruct sym
  "symbol structure"
  name
  package
  value
  function
  property-list)