(define (c0 f) (lambda (x) x)) (define (c1 f) (lambda (x) (f x))) (define (c2 f) (lambda (x) (f (f x)))) (define (c++ n) (lambda (f) (lambda (x) (f ((n f) x))))) (def 'c3 (c++ c2)) (def 'c4 (c++ c3)) (def 'c5 (c++ c4)) (define (tick s) (implode (list 'I s))) (say (list 'c0==> ((c0 tick) '.))) (say (list 'c1==> ((c1 tick) '.))) (say (list 'c2==> ((c2 tick) '.))) (say (list 'c3==> ((c3 tick) '.))) (say (list 'c4==> ((c4 tick) '.))) (say (list 'c5==> ((c5 tick) '.))) ; composition is multiplication (define (compose/curry f) (lambda (g) (lambda (x) (f (g x))))) (define (c* a b) ((compose/curry a) b)) (def 'c12 (c* c3 c4)) (say (list 'c12==> ((c12 tick) '.))) ; try subtraction (define (c-- n) (lambda (f) (lambda (x) (let f2 (lambda (pair) (let a (car pair) b (cadr pair) (list 'T (if a (f b) b)))) ;_say_ (say (list 'x==> x)) tmp ((n f2) (list 'nil x)) ;_say_ (say (list 'tmp==> tmp)) (cadr tmp))))) (say (list '{c--c5}==> (((c-- c5) tick) '.))) ; http://homepages.cwi.nl/~tromp/cl/lazy-k.html ; (Incidentally, the Church numeral 256 has a very compact representation in lambdas or combinators: ; it is ((lambda (n) (n n)) ((lambda (n) (n n)) (lambda (f x) (f (f x))))), or SII(SII(S(S(KS)K)I)).) (define (c256 F) ( (eval ((lambda (n) (n n)) ((lambda (m) (m m)) (lambda (f x) (f (f x))))) ) F ) ) (say (list 'c256<<< '((lambda (n) (n n)) ((lambda (m) (m m)) (lambda (f x) (f (f x))))) )) (say (list 'c256>>> c256 ))