sLisp
今度書く記事のためにelispでLISPインタープリタ「sLisp」を書きました。
http://github.com/sodeyama/slisp/blob/master/slisp.el
lisp言語で書いてはいますが、読み込んだ文字列をそのままread関数でS式をパースするような事はせず、
その他の言語で行うのと同じ処理を行っています。
具体的に言うと
- トークン切り出し
- パース
- 評価
をしています。
あと、以下の特徴のようにelispっぽいです。
sLispの特徴
- 変則動的スコープ
- 末尾最適化無し
- 遅延評価無し
sLisp対応primitive
- 四則演算
- 論理演算(or, and, not)
- 不等号(=, <, >)
- 条件(if, cond)
- setq
- let
- progn
- defun
- lambda
- print (数値、文字列、真偽値の表示)
sLispサンプルコード
(defun fib (n) (if (= n 0) 0 (if (= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))) (print (fib 5)) (setq result ((lambda (x y) (fib (+ x y))) 5 3)) (defun hoge (x) (let ((a 10)) (progn (print "aa") (+ (* a result) x)))) (print (hoge 3))
結果
5 aa 213