y(WIP)

TLS 里最终抽象出来的 Y 组合子长这样:

(define Y
    (lambda (le)
        ((lambda (f) (f f))
         (lambda (f) 
            (le (lambda (x) ((f f) x)))))))

里边稍微 apply 一层就跟经典的长得一样了:

(define Y
    (lambda (le)
        ((lambda (f)
            (le (lambda (x) ((f f) x))))
         (lambda (f)
            (le (lambda (x) ((f f) x)))))))

注意 (lambda (x) ((f f) x)) 其实就是 (f f),这里为了惰性求值包了一层。

(define Y
    (lambda (le)
        ((lambda (f)
            (le (f f)))
         (lambda (f)
            (le (f f))))))

(define fact
  (Y (lambda (fact1)
       (lambda (n)
         (cond
           ((= n 1) 1)
           (else (* n (fact1 (sub1 n)))))))))

(fact 1)
(fact 2)
(fact 3)
(fact 5)

上述写法会无穷递归