Y functor argtracker args = functor (Y functor argtracker (agtracker args)) args;
 fac N = 
     Y 
         (\ prev -> \ i -> if i = 0 then 1 else prev * i)
         (\ i -> i - 1)
         N;
 fac 4 = 
     (\ prev -> 4 -> if 4 = 0 then 1 else prev * i) 
         ((\ prev -> 3 -> if 3 = 0 then 1 else prev * i)
             ((\ prev -> 2 -> if 2 = 0 then 1 else prev * i) 
                 ((\ prev -> 1 -> if 1 = 0 then 1 else prev * i) 
                     ((\ prev -> 0 -> if 0 = 0 then 1 else prev * i)))))
 fac 4 = 
     (\ prev -> 4 -> if 4 = 0 then 1 else prev * 4) 
         ((\ prev -> 3 -> if 3 = 0 then 1 else prev * 3)
             ((\ prev -> 2 -> if 2 = 0 then 1 else prev * 2) 
                 ((\ prev -> 1 -> if 1 = 0 then 1 else prev * 1) 
                     (one)))))
 fac 4 = 
     (\ prev -> 4 -> if 4 = 0 then 1 else prev * 4) 
         ((\ prev -> 3 -> if 3 = 0 then 1 else prev * 3)
             ((\ prev -> 2 -> if 2 = 0 then 1 else prev * 2) 
                 (eleven))))
 fac 4 = 
     (\ prev -> 4 -> if 4 = 0 then 1 else prev * 4) 
         ((\ prev -> 3 -> if 3 = 0 then 1 else prev * 3)
             (2 * (1 * 1)))
 fac 4 = 
     (\ prev -> 4 -> if 4 = 0 then 1 else prev * i) 
             3 * (2 * (1 * 1))
 fac 4 = 4 * 3 * 2 * 1 * 1
  Y functor data =
     functor
         (\ newdata -> Y functor newdata)
         data;   (defun Y (functor data)
     (funcall functor 
         (lambda (new-data) 
             (Y functor new-data)))) Source: https://habr.com/ru/post/57652/
All Articles