Функциям можно дать имя для ссылки на себя, указав его между fn
и arglist:
user> ((fn ! [n] (if (= 1 n) 1 (* n (! (dec n))))) 5)
120
Вот способ сохранить анонимность, в основном:
(((fn [!] (fn [n] (if (= 1 n) 1 (* n ((! !) (dec n))))))
(fn [!] (fn [n] (if (= 1 n) 1 (* n ((! !) (dec n)))))))
5)
Это не совсем Y-комбинатор, но он содержит тот же бит самостоятельного применения, который позволяет Y делать свое дело. Имея копию всей функции в области видимости !
, когда вам это нужно, вы всегда можете сделать еще одну копию.