俺Lispでcall/ccと末尾再帰最適化
昔作った俺Lispにcall/ccと末尾再帰最適化を実装してみた。
(call/cc (lambda (c) (list 1 (c 2) 3)))
http://kar.s206.xrea.com/lisp/?e=(call%2Fcc%20(lambda%20(c)%20(list%201%20(c%202)%203)))
2
call/ccのテスト結果
(1 2 3)のリストを作る途中で抜けて2だけ返す。
((Y (lambda (f) (lambda (n) (if (eq? n 0) 'ok (f (- n 1)))))) 99)
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)
ok
末尾再帰の最適化のテスト結果
ここでは重くなるので引数を99にしたが、もっと大きくしてもスタックがあふれない。