俺Lispでcall/ccと末尾再帰最適化

昔作った俺Lispにcall/ccと末尾再帰最適化を実装してみた。

(call/cc (lambda (c) (list 1 (c 2) 3)))
2

http://kar.s206.xrea.com/lisp/?e=(call%2Fcc%20(lambda%20(c)%20(list%201%20(c%202)%203)))

call/ccのテスト結果
(1 2 3)のリストを作る途中で抜けて2だけ返す。

((Y (lambda (f) (lambda (n) (if (eq? n 0) 'ok (f (- n 1)))))) 99)
ok

http://kar.s206.xrea.com/lisp/?e=((Y%20(lambda%20(f)%20(lambda%20(n)%20(if%20(eq%3F%20n%200)%20%27ok%20(f%20(-%20n%201))))))%2099)

末尾再帰の最適化のテスト結果
ここでは重くなるので引数を99にしたが、もっと大きくしてもスタックがあふれない。