ループの話題で思い出したけど、 最新版のSBCLで以下のコードがn=5000程度で死ぬんですが、 末尾再帰の最適化はしてくれないんでしょうか? (defun w(n) (labels ((x (n) (write n) (if (> n 0) (y (- n 1)) )) (y (n) (write n) (if (> n 0) (z (- n 1)) )) (z (n) (write n) (if (> n 0) (x (- n 1)) ))) (x n))) (w 5000) ;程度で死ぬ
schemeでは (define (w n) (letrec ((x (lambda (n) (write n) (if (> n 0) (y (- n 1))))) (y (lambda (n) (write n) (if (> n 0) (z (- n 1))))) (z (lambda (n) (write n) (if (> n 0) (x (- n 1)))))) (x n))) (w 10000000000) ;nをいくら大きくしてもOK