annotate src/rlm/mike.clj @ 0:78a630e650d2

initial import
author Robert McIntyre <rlm@mit.edu>
date Tue, 18 Oct 2011 00:57:08 -0700
parents
children
rev   line source
rlm@0 1 (ns rlm.mike)
rlm@0 2
rlm@0 3 (defmacro define [name e]
rlm@0 4 (if (symbol? name)
rlm@0 5 `(def ~name ~e)
rlm@0 6 `(define ~(first name) (fn [~@(rest name)] (~@e)))))
rlm@0 7
rlm@0 8 (defmacro lambda [a b]
rlm@0 9 `(fn [~@a] ~b))
rlm@0 10
rlm@0 11 (defmacro with-quote-everything [form]
rlm@0 12 (let [prime (first form)
rlm@0 13 rests (rest form)
rlm@0 14 rests (map (fn [form] `(quote ~form)) rests)
rlm@0 15 ]
rlm@0 16 `(~prime ~@rests)))
rlm@0 17
rlm@0 18 (defn mike-define [name e]
rlm@0 19 (if (symbol? name)
rlm@0 20 (intern *ns* name e)
rlm@0 21 (mike-define (first name) '(lambda (rest name) e ))))
rlm@0 22
rlm@0 23 (defn Y
rlm@0 24 "The y-combinator"
rlm@0 25 [m]
rlm@0 26 ((fn [future]
rlm@0 27 (m (fn [arg]
rlm@0 28 ((future future) arg))))
rlm@0 29 (fn [future] ;;this reminds me a lot of a quine!
rlm@0 30 (m (fn [arg]
rlm@0 31 ((future future) arg)))) ))
rlm@0 32
rlm@0 33
rlm@0 34 (defn factorial [n]
rlm@0 35 (if (zero? n)
rlm@0 36 1
rlm@0 37 (* n (factorial (dec n)))) )
rlm@0 38
rlm@0 39 ((Y (fn [rec]
rlm@0 40 (fn [n]
rlm@0 41 (if (zero? n)
rlm@0 42 1
rlm@0 43 (* n (rec (dec n)))) ))) 6)