書き忘れてた

毎回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)

*1:非delay〜forceのYYのコストはO(呼び出し回数)、delay〜forceのYYのコストはO(再帰深さ)程度。破壊的変更をすればO(1)にすることも可能だが、本末転倒な気がする。