本末転倒版Y-Combinator?

破壊的に更新する

(define Y!
  (lambda (index . metas)
    (let ((table (map (lambda (meta)
                        (apply meta metas))
                      metas)))
      (let ((funcs (map car table))
            (settbl (map cdr table)))
        (map (lambda (setlst)
               (let loop ((curfs funcs)
                          (curss setlst))
                 (if (and (pair? curfs)
                          (pair? curss))
                     (begin
                       ((car curss) (car curfs))
                       (loop (cdr curfs)
                             (cdr curss))))))
             settbl)
        (list-ref funcs index)))))
(define-syntax y!lambda
  (syntax-rules ()
    ((_ (f ...) args . body)
     (lambda (f ...)
       (list (lambda args
               . body)
             (lambda (g)
               (set! f g))
             ...)))))
(define-syntax y!wrapper
  (syntax-rules ()
    ((_ (org) args . body)
     (lambda (meta)
       (lambda envs
         (let* ((retval (apply meta envs))
                (org (car retval)))
           (cons (lambda args
                   . body)
                 (cdr retval))))))))

(print ((Y! 0 ((y!wrapper (org)
                 (n)
                 (print n)
                 (org n))
               (y!lambda (f)
                 (n)
                 (if (zero? n)
                     0
                     (+ n (f (- n 1))))))) 10))

gaucheだとオーバーヘッドが10%以下。速度の面では極めて優秀なのだけど、これは違うよねえ。