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