Mercurial > rlm
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) |