Skip to content

Instantly share code, notes, and snippets.

@jiamo
Created October 21, 2019 10:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jiamo/f865bc8a9d921deb1ccf5df03fe9f9dc to your computer and use it in GitHub Desktop.
Save jiamo/f865bc8a9d921deb1ccf5df03fe9f9dc to your computer and use it in GitHub Desktop.
ycombinator from fix point of function
#lang lazy
(define g
(lambda (f)
(lambda (n)
(if (= n 0)
1
(* n (f (- n 1)))))))
(define f
(lambda (n)
(if (= n 0)
1
(* n (f (- n 1))))))
(define Y1
(lambda (f)
(f (Y1 f))))
(define (Y2 self)
(lambda (f)
(f ((self self) f)))) ;; 这里没有 f
(((Y2 Y2) g) 5)
;; self self to let
;; but here we are lazy lang we can just use (self self)
(define (Y3 self)
(lambda (f)
(let ((g (self self))) (f (g f)))))
(((Y3 Y3) g) 5)
;; ;; (let ((x <expr1>)) <expr2>)
;; ==> ((lambda (x) <expr2>) <expr1>)
(define (Y4 self)
(lambda (f) ((lambda (g) (f (g f))) (self self))))
;; self can be as arg used in Y6
(define N4
(lambda (self)
(lambda (f) ((lambda (g) (f (g f))) (self self)))))
(((Y4 Y4) g) 5)
(((N4 N4) g) 5)
(define Y5 (Y4 Y4))
((Y5 g) 5)
(define Y6
(let ((Y4-local (lambda (self) (lambda (f) ((lambda (g) (f (g f))) (self self))))))
(Y4-local Y4-local)))
((Y6 g) 5)
(define Y7
(let ((h (lambda (self) (lambda (f) ((lambda (g) (f (g f))) (self self))))))
(h h)))
((Y7 g) 5)
(define Y8
((lambda (h) (h h))
(lambda (self) (lambda (f) ((lambda (g) (f (g f))) (self self))))))
((Y8 g) 5)
;; self can be g
;;(lambda (k) (lambda (f) (lambda (g) (f (g f))) (k k))) to h
(define Y9
((lambda (self) (lambda (f) ((lambda (g) (f (g f))) (self self))))
(lambda (self) (lambda (f) ((lambda (g) (f (g f))) (self self))))))
(define Y10
((lambda (h) (lambda (f) ((lambda (g) (f (g f))) (h h))))
(lambda (h) (lambda (f) ((lambda (g) (f (g f))) (h h))))))
(define Y11
((lambda (h) (lambda (f) (f ((h h) f))))
(lambda (h) (lambda (f) (f ((h h) f))))))
;; (lambda (x)(f x)) = f 等价
;; (lambda (f) (f ((h h) f))
(define Y0
(lambda (f)
(f (Y0 f))))
((Y11 g) 5)
(define Y12
(lambda (f)
(f (((lambda (h) (lambda (f) (f ((h h) f))))
(lambda (h) (lambda (f) (f ((h h) f)))))
f))))
(define Y14
(lambda (g)
(g (((lambda (h) (lambda (g) (g ((h h) g))))
(lambda (h) (lambda (g) (g ((h h) g))))) g))))
((Y14 g) 5)
(define Y15
(lambda (g)
((lambda (h) (g (h h)))
(lambda (h) (g (h h))))))
((Y12 g) 5)
(define Y16
(lambda (f)
(f (Y11
f))))
((Y15 g) 5)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment