Skip to content

Instantly share code, notes, and snippets.

@igstan
Created December 29, 2010 13:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save igstan/758521 to your computer and use it in GitHub Desktop.
Save igstan/758521 to your computer and use it in GitHub Desktop.
Y combinator in Clojure
;; Step 1
(defn fact1 [n]
(if (< n 2) 1 (* n (fact1 (- n 1)))))
(println (fact1 5))
;; Step 2
(def fact2
((fn [f]
(fn [n]
(if (< n 2) 1
(* n ((f f) (- n 1))))))
(fn [f]
(fn [n]
(if (< n 2) 1
(* n ((f f) (- n 1))))))))
(println (fact2 5))
;; Step 3
(defn omega [f] (f f))
(def fact3
(omega (fn [f]
(fn [n] (if (< n 2) 1
(* n ((f f) (- n 1))))))))
(println (fact3 5))
;; Step 4
(def fact4
(omega (fn [f]
(let [g (fn [n] ((f f) n))]
(fn [n] (if (< n 2) 1
(* n (g (- n 1)))))))))
(println (fact4 5))
;; Step 5
(defn wrap
[h]
(omega (fn [f]
(let [g (fn [n] ((f f) n))]
(h g)))))
(def fact5
(wrap
(fn [g]
(fn [n]
(if (< n 2) 1 (* n (g (- n 1))))))))
(println (fact5 5))
;; Step 6
(defn wrap6 [h] (omega (fn [f] (h (fn [n] ((f f) n))))))
(def fact6
(wrap6
(fn [g]
(fn [n]
(if (< n 2) 1 (* n (g (- n 1))))))))
(println (fact6 5))
;; Step 7
(defn Y [h]
((fn [f] (f f))
(fn [f] (h (fn [n] ((f f) n))))))
(def fact7
(Y (fn [g] (fn [n] (if (< n 2) 1
(* n (g (- n 1))))))))
(println (fact7 5))
@zmack
Copy link

zmack commented Dec 29, 2010

.clj omg ;o

@igstan
Copy link
Author

igstan commented Dec 29, 2010

M-am jucat si eu putin :) Nu cred ca ma apuc de Clojure, are ceva ce nu-mi place.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment