書き忘れてた
毎回lambdaを生成するのは実行コストが高いからdelay〜forceすると軽くなる*1。
delay〜force化
(define YY (lambda (index . metas) ((lambda (mm) (apply (mm (list-ref metas index)) (map mm metas))) (lambda (meta) (lambda procs ((lambda (pp) (apply meta (map pp procs))) (lambda (proc) (delay (apply proc procs))))))))) (define p0 (lambda (d0 d1) (lambda (n) (if (zero? n) 1 (+ n ((force d1) (- n 1))))))) (define p1 (lambda (d0 d1) (lambda (n) (if (zero? n) 1 (+ n ((force d0) (- n 1))))))) (display ((YY p0 p1) 123)) (newline)