#|
(\g -> (\x-> x x) (\x-> g (\n-> (x x) n)))
(\fact -> \n k -> 
               (equals n 0)
                 (\True -> k 1) 
                 (\False -> decr n 
                                 (\n1-> fact n1 
                                             (\f1-> mult n f1 k))))
5 display |#

(define (mult k) (lambda (x y) (k (* x y))))
(define (decr k) (lambda (x) (k (- x 1))))
(define (equals s f) (lambda (x y) (if (= x y) (s) (f))))

((((lambda (g) 
     ( (lambda (x) (x x))
       (lambda (x) (g (lambda (k) ((x x) k))))))

   (lambda (fact)
    (lambda (k)
      (lambda (n)
        ((equals  (lambda () (k 1))
                  (lambda () ((decr (lambda (n1) 
                                        ((fact 
                                            (lambda (f1) ((mult k) n f1)))
                                         n1)))
                               n)))
          n 0)))))

   (lambda (x) (display x))) 
  5)
