diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..1cda293
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
new file mode 100644
index 0000000..ce8435a
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
+
+
+ macros
+
+
+
+
+
+ ccw.builder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ ccw.nature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/.settings/ccw.repl.cmdhistory.prefs b/.settings/ccw.repl.cmdhistory.prefs
new file mode 100644
index 0000000..d13a8f0
--- /dev/null
+++ b/.settings/ccw.repl.cmdhistory.prefs
@@ -0,0 +1,3 @@
+#Sat May 21 16:26:14 PDT 2011
+cmdhistory=["1" ";; Loading file src/day/core.clj" "(unless true (/ 1 0))" ";; Loading file src/day/core.clj" ";; Switching to day.core namespace" "(unless true (println \\"haha\!\\"))" "(unless false (println \\"haha\!\\"))" ";; Loading file src/day/core.clj" ";; Switching to day.core namespace" "(unless-amit true (println \\"haha\!\\"))" "(unless-amit false (println \\"haha\!\\"))" ";; Loading file src/day/core.clj" ";; Switching to day.core namespace" "(unless-full\\n false (println \\"haha\!\\"))" "(macroexpand-1 (unless-full\\n false (println \\"haha\!\\")))" "(macroexpand-1 '(unless-amit\\n false (println \\"haha\!\\")))" "(macroexpand-1 '(unless\\n false (println \\"haha\!\\")))" "(macroexpand '(unless\\n false (println \\"haha\!\\")))" ";; Loading file src/day/core.clj" ";; Switching to day.core namespace" "(unless-do false (println \\"Ha\!\\") (println \\"More\!\\"))" "apply" "(source apply)" "do" "(defmacro foo [ & f]\\n `(let [a (inc 1)]\\n (println f)))" "(foo 2 3 4)" "(defmacro foo [ & f]\\n `(let [a\# (inc 1)]\\n (println f)))" "(foo 2 3 4)" "(defmacro foo [ & f]\\n `(let [a\# (inc 1)]\\n (println ~f)))" "(foo 2 3 4)" "(defmacro foo [ & f]\\n `(let [a\# (inc 1)]\\n (println ~@f)))" "(foo 2 3 4)" "(defmacro foo [ & f]\\n `(let [a\# (inc 1)]\\n (println (symbol a\#) ~@f)))" "(foo 2 3 4)" "(defmacro foo [ & f]\\n `(let [a\# (inc 1)]\\n (println 'a\# ~@f)))" "(foo 2 3 4)" "(defmacro foo [ & f]\\n `(let [a (inc 1)]\\n (println ~@f)))" "(foo 2 3 4)" "(macroexpand-1 '(foo 2 3 4))" ";; Loading file src/day/core.clj" ";; Switching to day.core namespace" "(foo 2 3 4)" ";; Switching to day.core namespace" "(my-declare a b c)" ";; Switching to day.core namespace" "(my-declare a b c)" "(macroexpand-1 (my-declare a b c))" "(macroexpand (my-declare a b c))" "(macroexpand-1 (my-declare a b c))" "(macroexpand-1 '(my-declare a b c))" "(macroexpand-1 '(my-declare-2 a b c))" ";; Loading file src/day/core.clj" ";; Switching to day.core namespace" "(macroexpand-1 '(my-declare-1 a b c))" "(macroexpand-1 '(defmacro foo [a] nil))" "(defn f [x] x)" "(.setMacro (var f))" "(meta 'f)" "(meta '\#f)" "(meta \#'f)" "(macroexpand-1 '(and 1 2 3))" "(macroexpand-1 '(and 1 2 3 4))" "(macroexpand '(and 1 2 3 4))" "(clojure.walk/macroexpand-all '(and 1 2 3 4))" "(var and)" ";; Switching to day.core namespace" "(infix 2 * 7)" "(macroexpand '(clojure.test/is (\= 1 2)))" "(def _|_ nil)" "_|_" "(clojure.walk/walk identity identity '(let [a 1] (inc a)))" "(symbol? 'a)" "(symbol? 1)" "(defn adorn [x] (if (symbol? x) (str \\"_\\" (name x)) x))" "(clojure.walk/walk adorn identity '(let [a 1] (inc a)))" "(defn adorn [x] (if (symbol? x) (symbol (str \\"_\\" (name x))) x))" "(clojure.walk/walk adorn identity '(let [a 1] (inc a)))" "(defn adorn [x] (if (var? x) (symbol (str \\"_\\" (name x))) x))" "(clojure.walk/walk adorn identity '(let [a 1] (inc a)))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" ";; Loading file src/day/advanced.clj" "let" "(macroexpand-1 '(let [a 1] (inc a)))" "let*" "(my-let [[x y] '(2 3)] (* x y))" "(defn foo [a b] (+ a b))" "(foo 1 2 )" "(foo 1 2 3)" "(extend-fn foo [x y z] (* x y z))" "1" ";; Switching to day.advanced namespace" "(extend-fn foo [d e f] (* d e f))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" "(extend-fn foo [d e f] (* d e f))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" "(extend-fn foo [d e f] (* d e f))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" "(extend-fn foo [d e f] (* d e f))" ";; Loading file src/day/advanced.clj" "(macroexpand-1 (extend-fn foo [d e f] (* d e f)))" "(macroexpand-1 '(extend-fn foo [d e f] (* d e f)))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" "(macroexpand-1 '(extend-fn foo [d e f] (* d e f)))" "(extend-fn foo [d e f] (* d e f))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" "(macroexpand-1 '(extend-fn foo [d e f] (* d e f)))" "(extend-fn foo [d e f] (* d e f))" ";; Loading file src/day/advanced.clj" ";; Switching to day.advanced namespace" "(extend-fn foo [d e f] (* d e f))" "(macroexpand-1 '(extend-fn foo [d e f] (* d e f)))" "(foo 1 2)" "(foo 1 2 3)" "(pprint \\n (macroexpand-1 '(extend-fn foo [d e f] (* d e f))))" "pprint" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" "(anaphoric-if (some-computation 11)\\n (* 2 it))" "(anaphoric-if (some-computation 12)\\n (* 2 it))" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" "(anaphoric-if (some-computation 12)\\n (* 2 it))" "(anaphoric-if (some-computation 11)\\n (* 2 it))" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" "(anaphoric-if (some-computation 11)\\n (* 2 it))" "(anaphoric-if (some-computation 11)\\n (println \\"it \=\\" it)\\n (* 2 it))" "(anaphoric-if (some-computation 12)\\n (println \\"it \=\\" it)\\n (* 2 it))" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" "(anaphoric-if (some-computation 12)\\n (println \\"it \=\\" it)\\n (* 2 it))" "(anaphoric-if (some-computation 11)\\n (println \\"it \=\\" it)\\n (* 2 it))" "(anaphoric-if (some-computation 11)\\n (println \\"it \=\\" it)\\n (map (partial * it) [1 2 3 4]))" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" "(anaphoric-and 2 (* 3 it) (+ 1 it))" "(def m { \:cust { \:addr { \:name { \:first \\"Sean\\" \:last \\"Corfield\\"}}}})" "(anaphoric-and m (\:cust it) (\:addr it) (\:name it) (\:last it))" ";; Loading file src/day/anaphora.clj" "(with-it (and m (\:cust it)))" "(with-it\\n (if (even? 1) false (inc 1)))" ";; Loading file src/day/anaphora.clj" ";; Switching to day.anaphora namespace" "(thread-it 2 (* it 3) (+ 1 it))" "(thread-it 2 (* it 3) (+ it it))" "(thread-it 2 (* it 3) (+ it it) it)" "(thread-it 2 (* it 3) (+ it it) (inc it))" "(if 2 (* it 3))" ";; Switching to day.anaphora namespace" "(if 2 (* it 3))" "(a-if 2 (* it 3))" "(thread-it 2 (* it 3) (+ it it) (inc it))" "(thread-it (* 10 20) (inc it) (- it 8))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" "(var bindind)" "(var binding)" "(apply binding '([x 1] (inc x)))" ";; Loading file src/day/macmac.clj" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(make-synonym b binding)" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(t 1 2 3))" "(macroexpand-1 '(t 1))" "(macroexpand-1 '(t [1 2]))" "splice" "unsplice" "~" "`()" "(find-doc \\"back-quote\\")" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(macroexpand-1 '(make-synonym b binding))" "(make-synonym b binding)" "(b [x 10] (inc x))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(make-synonym b binding)" "(b [x 10] (inc x))" "(make-synonym c binding)" "(c [x 10] (inc x))" "(binding [x 10] (inc x))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(binding [x 10] (inc x))" "binding" "(macroexpand-1 '(binding [x 10] (inc x)))" "(declare x\\n )" "(binding [x 10] (inc x))" ";; Loading file src/day/macmac.clj" ";; Switching to day.macmac namespace" "(make-synonym a binding)" "(a [x 11] (inc x))" "(def ^\:dynamic *foo* 1)" "*foo*" "(meta (var *foo*))" "(doc condp)" ";; Loading file src/day/clos.clj" ";; Switching to day.clos namespace" ";; Loading file src/day/clos.clj" "(method-spec ['foo '[a b c] '(code)])" "(def body '( (extends base) (method foo [a b c] (code))))" ";; Loading file src/day/clos.clj" "(siva \:make-sound)"]
+eclipse.preferences.version=1
diff --git a/bin/day/advanced.clj b/bin/day/advanced.clj
new file mode 100644
index 0000000..0fb9faa
--- /dev/null
+++ b/bin/day/advanced.clj
@@ -0,0 +1,27 @@
+(ns day.advanced)
+
+#_ (my-let [x 10
+ y x
+ z (+ x y)]
+ (* x y z))
+
+(defmacro single-arg-fn [[v expr] & body]
+ `((fn [~v] ~@body) ~expr))
+
+(defmacro my-let [lettings & body]
+ (let [helper (fn
+ ([] `(do ~@body))
+ ([v expr & more]
+ `(single-arg-fn [~v ~expr]
+ (my-let ~more ~@body))))]
+ (apply helper lettings)))
+
+;; (extend-fn f [x y z] (* x y z))
+(defmacro extend-fn [name args & body]
+ `(let [old-fn# (var-get (var ~name))
+ new-fn# (fn ~args (do ~@body))
+ dispatcher# (fn [& more#]
+ (if (= ~(count args) (count more#))
+ (apply new-fn# more#)
+ (apply old-fn# more#)))]
+ (alter-var-root (var ~name) (constantly dispatcher#))))
diff --git a/bin/day/anaphora.clj b/bin/day/anaphora.clj
new file mode 100644
index 0000000..549f53d
--- /dev/null
+++ b/bin/day/anaphora.clj
@@ -0,0 +1,31 @@
+(ns day.anaphora)
+
+;; ~'x => capture x as variable
+
+#_(anaphoric-if (some-computation 11)
+ (* 2 it))
+
+(defn some-computation [x] (if (even? x) false (inc x)))
+
+(defmacro anaphoric-if [expr & body]
+ `(if-let [~'it ~expr] (do ~@body)))
+
+(defmacro anaphoric-and
+ ([] true)
+ ([x] x)
+ ([x & more]
+ `(anaphoric-if ~x
+ (anaphoric-and ~@more))))
+
+(defmacro with-it [f a & more]
+ `(let [~'it ~a]
+ (~f ~'it ~@more)))
+
+(defmacro a-if [a & more]
+ `(with-it if ~a ~@more))
+
+(defmacro thread-it
+ ([x] x)
+ ([x & more]
+ `(let [~'it ~x]
+ (thread-it ~@more))))
\ No newline at end of file
diff --git a/bin/day/clos.clj b/bin/day/clos.clj
new file mode 100644
index 0000000..5717f92
--- /dev/null
+++ b/bin/day/clos.clj
@@ -0,0 +1,59 @@
+(ns day.clos)
+
+(def this)
+
+(defn method-call [klass m-name args]
+ (if klass
+ (let [m (m-name (klass :methods))]
+ (if m
+ (apply m args)
+ (method-call (klass :parent) m-name args)))
+ (throw (RuntimeException. (str "Unable to find method named " m-name)))))
+
+(defn new-object [klass]
+ (let [state (atom {})]
+ (fn thiz [c & args]
+ (binding [this thiz]
+ (condp = c
+ :class klass
+ :class-name (klass :name)
+ :set! (let [[k v] args]
+ (dosync
+ (alter state assoc k v)))
+ :get (let [[k] args]
+ (state k))
+ (method-call klass c args))))))
+
+(defn new-class [class-name methods parent]
+ (fn thiz [c & args]
+ (condp = c
+ :name (name class-name)
+ :new (new-object thiz)
+ :methods methods
+ :parent parent)))
+
+(defn method-spec [[mname args & body]]
+ `{~(keyword mname) (fn ~args ~@body)})
+
+(defmacro defclass [c-name & body]
+ (let [m-specs (map rest (filter #(= (first %) 'method) body))
+ methods (apply merge (map method-spec m-specs))
+ parent (last (apply merge (filter #(= (first %)'extends) body)))]
+ `(def ~c-name (new-class (keyword '~c-name) ~methods ~parent))))
+
+;; examples
+
+(defclass Animal
+ (method make-sound [] (str "SOUND!")))
+
+(defclass Person
+ (extends Animal)
+ (method say-hello [n] (str "Hello " n "!")))
+
+(def siva (Person :new))
+
+(siva :class-name)
+
+(siva :make-sound)
+
+(siva :say-hello "Sean")
\ No newline at end of file
diff --git a/bin/day/core.clj b/bin/day/core.clj
new file mode 100644
index 0000000..90d9b33
--- /dev/null
+++ b/bin/day/core.clj
@@ -0,0 +1,31 @@
+(ns day.core)
+
+;; cannot define unless as a function because args
+;; are evaluated eagerly, not lazily...
+(defmacro unless [p body]
+ `(if ~p nil ~body))
+
+(defmacro unless-amit [expr form]
+ (list 'if expr nil form))
+
+(defmacro unless-do [expr & forms]
+ `(if ~expr nil (do ~@forms)))
+
+(defmacro foo [ & f]
+ `(let [a# (inc 1)]
+ (println 'a# 'f ~@f)))
+
+(defmacro my-declare [ & vars]
+ `(do ~@(map #(list 'def %) vars)))
+
+(defmacro my-declare-2 [ & vars]
+ `(do ~@(for [v# vars] (list 'def v#))))
+
+(defn def-form [x]
+ `(def ~x))
+
+(defmacro my-declare-1 [ & vars]
+ `(do ~@(map def-form vars)))
+
+(defmacro infix [a op b]
+ `(~op ~a ~b))
\ No newline at end of file
diff --git a/bin/day/macmac.clj b/bin/day/macmac.clj
new file mode 100644
index 0000000..4cbafd6
--- /dev/null
+++ b/bin/day/macmac.clj
@@ -0,0 +1,7 @@
+(ns day.macmac)
+
+;; (make-synonym b binding) for example
+
+(defmacro make-synonym [name orig]
+ `(defmacro ~name [& ~'stuff]
+ `(~'~orig ~@~'stuff)))
\ No newline at end of file
diff --git a/classes/day/advanced$extend_fn.class b/classes/day/advanced$extend_fn.class
new file mode 100644
index 0000000..a98383b
Binary files /dev/null and b/classes/day/advanced$extend_fn.class differ
diff --git a/classes/day/advanced$loading__4410__auto__.class b/classes/day/advanced$loading__4410__auto__.class
new file mode 100644
index 0000000..6302fea
Binary files /dev/null and b/classes/day/advanced$loading__4410__auto__.class differ
diff --git a/classes/day/advanced$my_let$helper__1004.class b/classes/day/advanced$my_let$helper__1004.class
new file mode 100644
index 0000000..012b3c0
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1004.class differ
diff --git a/classes/day/advanced$my_let$helper__1066.class b/classes/day/advanced$my_let$helper__1066.class
new file mode 100644
index 0000000..03c07dc
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1066.class differ
diff --git a/classes/day/advanced$my_let$helper__1093.class b/classes/day/advanced$my_let$helper__1093.class
new file mode 100644
index 0000000..8e4dc90
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1093.class differ
diff --git a/classes/day/advanced$my_let$helper__1124.class b/classes/day/advanced$my_let$helper__1124.class
new file mode 100644
index 0000000..ebe7a6d
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1124.class differ
diff --git a/classes/day/advanced$my_let$helper__1177.class b/classes/day/advanced$my_let$helper__1177.class
new file mode 100644
index 0000000..1a0d63d
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1177.class differ
diff --git a/classes/day/advanced$my_let$helper__1230.class b/classes/day/advanced$my_let$helper__1230.class
new file mode 100644
index 0000000..b80156e
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1230.class differ
diff --git a/classes/day/advanced$my_let$helper__1283.class b/classes/day/advanced$my_let$helper__1283.class
new file mode 100644
index 0000000..48a336c
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1283.class differ
diff --git a/classes/day/advanced$my_let$helper__1336.class b/classes/day/advanced$my_let$helper__1336.class
new file mode 100644
index 0000000..be7c7a5
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1336.class differ
diff --git a/classes/day/advanced$my_let$helper__1417.class b/classes/day/advanced$my_let$helper__1417.class
new file mode 100644
index 0000000..4ce55f8
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1417.class differ
diff --git a/classes/day/advanced$my_let$helper__1479.class b/classes/day/advanced$my_let$helper__1479.class
new file mode 100644
index 0000000..6b030d8
Binary files /dev/null and b/classes/day/advanced$my_let$helper__1479.class differ
diff --git a/classes/day/advanced$my_let$helper__969.class b/classes/day/advanced$my_let$helper__969.class
new file mode 100644
index 0000000..157065e
Binary files /dev/null and b/classes/day/advanced$my_let$helper__969.class differ
diff --git a/classes/day/advanced$my_let.class b/classes/day/advanced$my_let.class
new file mode 100644
index 0000000..9291f79
Binary files /dev/null and b/classes/day/advanced$my_let.class differ
diff --git a/classes/day/advanced$single_arg_fn.class b/classes/day/advanced$single_arg_fn.class
new file mode 100644
index 0000000..1964afb
Binary files /dev/null and b/classes/day/advanced$single_arg_fn.class differ
diff --git a/classes/day/advanced__init.class b/classes/day/advanced__init.class
new file mode 100644
index 0000000..586db60
Binary files /dev/null and b/classes/day/advanced__init.class differ
diff --git a/classes/day/anaphora$a_if.class b/classes/day/anaphora$a_if.class
new file mode 100644
index 0000000..8ff5895
Binary files /dev/null and b/classes/day/anaphora$a_if.class differ
diff --git a/classes/day/anaphora$anaphoric_and.class b/classes/day/anaphora$anaphoric_and.class
new file mode 100644
index 0000000..882e4aa
Binary files /dev/null and b/classes/day/anaphora$anaphoric_and.class differ
diff --git a/classes/day/anaphora$anaphoric_if.class b/classes/day/anaphora$anaphoric_if.class
new file mode 100644
index 0000000..c03cdbc
Binary files /dev/null and b/classes/day/anaphora$anaphoric_if.class differ
diff --git a/classes/day/anaphora$fn__578.class b/classes/day/anaphora$fn__578.class
new file mode 100644
index 0000000..2fd8d8c
Binary files /dev/null and b/classes/day/anaphora$fn__578.class differ
diff --git a/classes/day/anaphora$fn__625.class b/classes/day/anaphora$fn__625.class
new file mode 100644
index 0000000..edb4585
Binary files /dev/null and b/classes/day/anaphora$fn__625.class differ
diff --git a/classes/day/anaphora$fn__681.class b/classes/day/anaphora$fn__681.class
new file mode 100644
index 0000000..6a8f227
Binary files /dev/null and b/classes/day/anaphora$fn__681.class differ
diff --git a/classes/day/anaphora$fn__724.class b/classes/day/anaphora$fn__724.class
new file mode 100644
index 0000000..ab663bc
Binary files /dev/null and b/classes/day/anaphora$fn__724.class differ
diff --git a/classes/day/anaphora$loading__4410__auto__.class b/classes/day/anaphora$loading__4410__auto__.class
new file mode 100644
index 0000000..171092f
Binary files /dev/null and b/classes/day/anaphora$loading__4410__auto__.class differ
diff --git a/classes/day/anaphora$some_computation.class b/classes/day/anaphora$some_computation.class
new file mode 100644
index 0000000..c08bec3
Binary files /dev/null and b/classes/day/anaphora$some_computation.class differ
diff --git a/classes/day/anaphora$thread_it.class b/classes/day/anaphora$thread_it.class
new file mode 100644
index 0000000..63dacfc
Binary files /dev/null and b/classes/day/anaphora$thread_it.class differ
diff --git a/classes/day/anaphora$with_it.class b/classes/day/anaphora$with_it.class
new file mode 100644
index 0000000..f7dbba4
Binary files /dev/null and b/classes/day/anaphora$with_it.class differ
diff --git a/classes/day/anaphora__init.class b/classes/day/anaphora__init.class
new file mode 100644
index 0000000..019067a
Binary files /dev/null and b/classes/day/anaphora__init.class differ
diff --git a/classes/day/clos$defclass$fn__504.class b/classes/day/clos$defclass$fn__504.class
new file mode 100644
index 0000000..323ce2a
Binary files /dev/null and b/classes/day/clos$defclass$fn__504.class differ
diff --git a/classes/day/clos$defclass$fn__539.class b/classes/day/clos$defclass$fn__539.class
new file mode 100644
index 0000000..26584f8
Binary files /dev/null and b/classes/day/clos$defclass$fn__539.class differ
diff --git a/classes/day/clos$defclass$fn__541.class b/classes/day/clos$defclass$fn__541.class
new file mode 100644
index 0000000..7b08767
Binary files /dev/null and b/classes/day/clos$defclass$fn__541.class differ
diff --git a/classes/day/clos$defclass$fn__577.class b/classes/day/clos$defclass$fn__577.class
new file mode 100644
index 0000000..a879d51
Binary files /dev/null and b/classes/day/clos$defclass$fn__577.class differ
diff --git a/classes/day/clos$defclass$fn__579.class b/classes/day/clos$defclass$fn__579.class
new file mode 100644
index 0000000..8c8e91a
Binary files /dev/null and b/classes/day/clos$defclass$fn__579.class differ
diff --git a/classes/day/clos$defclass$fn__654.class b/classes/day/clos$defclass$fn__654.class
new file mode 100644
index 0000000..8c50a1c
Binary files /dev/null and b/classes/day/clos$defclass$fn__654.class differ
diff --git a/classes/day/clos$defclass$fn__656.class b/classes/day/clos$defclass$fn__656.class
new file mode 100644
index 0000000..2ac17f6
Binary files /dev/null and b/classes/day/clos$defclass$fn__656.class differ
diff --git a/classes/day/clos$defclass$fn__749.class b/classes/day/clos$defclass$fn__749.class
new file mode 100644
index 0000000..859a1ee
Binary files /dev/null and b/classes/day/clos$defclass$fn__749.class differ
diff --git a/classes/day/clos$defclass$fn__751.class b/classes/day/clos$defclass$fn__751.class
new file mode 100644
index 0000000..ce24033
Binary files /dev/null and b/classes/day/clos$defclass$fn__751.class differ
diff --git a/classes/day/clos$defclass$fn__797.class b/classes/day/clos$defclass$fn__797.class
new file mode 100644
index 0000000..1c27c40
Binary files /dev/null and b/classes/day/clos$defclass$fn__797.class differ
diff --git a/classes/day/clos$defclass$fn__799.class b/classes/day/clos$defclass$fn__799.class
new file mode 100644
index 0000000..435774f
Binary files /dev/null and b/classes/day/clos$defclass$fn__799.class differ
diff --git a/classes/day/clos$defclass$fn__835.class b/classes/day/clos$defclass$fn__835.class
new file mode 100644
index 0000000..5effd2b
Binary files /dev/null and b/classes/day/clos$defclass$fn__835.class differ
diff --git a/classes/day/clos$defclass$fn__837.class b/classes/day/clos$defclass$fn__837.class
new file mode 100644
index 0000000..2fe59e5
Binary files /dev/null and b/classes/day/clos$defclass$fn__837.class differ
diff --git a/classes/day/clos$defclass.class b/classes/day/clos$defclass.class
new file mode 100644
index 0000000..dcc48fe
Binary files /dev/null and b/classes/day/clos$defclass.class differ
diff --git a/classes/day/clos$fn__840.class b/classes/day/clos$fn__840.class
new file mode 100644
index 0000000..b9ab915
Binary files /dev/null and b/classes/day/clos$fn__840.class differ
diff --git a/classes/day/clos$fn__842.class b/classes/day/clos$fn__842.class
new file mode 100644
index 0000000..93dd392
Binary files /dev/null and b/classes/day/clos$fn__842.class differ
diff --git a/classes/day/clos$loading__4410__auto__.class b/classes/day/clos$loading__4410__auto__.class
new file mode 100644
index 0000000..0467352
Binary files /dev/null and b/classes/day/clos$loading__4410__auto__.class differ
diff --git a/classes/day/clos$method_call.class b/classes/day/clos$method_call.class
new file mode 100644
index 0000000..cf235f9
Binary files /dev/null and b/classes/day/clos$method_call.class differ
diff --git a/classes/day/clos$method_spec.class b/classes/day/clos$method_spec.class
new file mode 100644
index 0000000..0769d72
Binary files /dev/null and b/classes/day/clos$method_spec.class differ
diff --git a/classes/day/clos$new_class$thiz__377.class b/classes/day/clos$new_class$thiz__377.class
new file mode 100644
index 0000000..71eb4fe
Binary files /dev/null and b/classes/day/clos$new_class$thiz__377.class differ
diff --git a/classes/day/clos$new_class$thiz__464.class b/classes/day/clos$new_class$thiz__464.class
new file mode 100644
index 0000000..413d34c
Binary files /dev/null and b/classes/day/clos$new_class$thiz__464.class differ
diff --git a/classes/day/clos$new_class$thiz__493.class b/classes/day/clos$new_class$thiz__493.class
new file mode 100644
index 0000000..5e5838e
Binary files /dev/null and b/classes/day/clos$new_class$thiz__493.class differ
diff --git a/classes/day/clos$new_class$thiz__528.class b/classes/day/clos$new_class$thiz__528.class
new file mode 100644
index 0000000..70dde9e
Binary files /dev/null and b/classes/day/clos$new_class$thiz__528.class differ
diff --git a/classes/day/clos$new_class$thiz__566.class b/classes/day/clos$new_class$thiz__566.class
new file mode 100644
index 0000000..c78a0d1
Binary files /dev/null and b/classes/day/clos$new_class$thiz__566.class differ
diff --git a/classes/day/clos$new_class$thiz__643.class b/classes/day/clos$new_class$thiz__643.class
new file mode 100644
index 0000000..2281b0c
Binary files /dev/null and b/classes/day/clos$new_class$thiz__643.class differ
diff --git a/classes/day/clos$new_class$thiz__738.class b/classes/day/clos$new_class$thiz__738.class
new file mode 100644
index 0000000..c096221
Binary files /dev/null and b/classes/day/clos$new_class$thiz__738.class differ
diff --git a/classes/day/clos$new_class$thiz__786.class b/classes/day/clos$new_class$thiz__786.class
new file mode 100644
index 0000000..fde4a28
Binary files /dev/null and b/classes/day/clos$new_class$thiz__786.class differ
diff --git a/classes/day/clos$new_class$thiz__824.class b/classes/day/clos$new_class$thiz__824.class
new file mode 100644
index 0000000..9f067be
Binary files /dev/null and b/classes/day/clos$new_class$thiz__824.class differ
diff --git a/classes/day/clos$new_class.class b/classes/day/clos$new_class.class
new file mode 100644
index 0000000..2b80aae
Binary files /dev/null and b/classes/day/clos$new_class.class differ
diff --git a/classes/day/clos$new_object$fn__367$fn__372.class b/classes/day/clos$new_object$fn__367$fn__372.class
new file mode 100644
index 0000000..c5f4696
Binary files /dev/null and b/classes/day/clos$new_object$fn__367$fn__372.class differ
diff --git a/classes/day/clos$new_object$fn__367.class b/classes/day/clos$new_object$fn__367.class
new file mode 100644
index 0000000..73161b0
Binary files /dev/null and b/classes/day/clos$new_object$fn__367.class differ
diff --git a/classes/day/clos$new_object$thiz__454$fn__459.class b/classes/day/clos$new_object$thiz__454$fn__459.class
new file mode 100644
index 0000000..19d1b71
Binary files /dev/null and b/classes/day/clos$new_object$thiz__454$fn__459.class differ
diff --git a/classes/day/clos$new_object$thiz__454.class b/classes/day/clos$new_object$thiz__454.class
new file mode 100644
index 0000000..a5b8cac
Binary files /dev/null and b/classes/day/clos$new_object$thiz__454.class differ
diff --git a/classes/day/clos$new_object$thiz__483$fn__488.class b/classes/day/clos$new_object$thiz__483$fn__488.class
new file mode 100644
index 0000000..c039772
Binary files /dev/null and b/classes/day/clos$new_object$thiz__483$fn__488.class differ
diff --git a/classes/day/clos$new_object$thiz__483.class b/classes/day/clos$new_object$thiz__483.class
new file mode 100644
index 0000000..73c1945
Binary files /dev/null and b/classes/day/clos$new_object$thiz__483.class differ
diff --git a/classes/day/clos$new_object$thiz__518$fn__523.class b/classes/day/clos$new_object$thiz__518$fn__523.class
new file mode 100644
index 0000000..64bd7a1
Binary files /dev/null and b/classes/day/clos$new_object$thiz__518$fn__523.class differ
diff --git a/classes/day/clos$new_object$thiz__518.class b/classes/day/clos$new_object$thiz__518.class
new file mode 100644
index 0000000..dec0194
Binary files /dev/null and b/classes/day/clos$new_object$thiz__518.class differ
diff --git a/classes/day/clos$new_object$thiz__556$fn__561.class b/classes/day/clos$new_object$thiz__556$fn__561.class
new file mode 100644
index 0000000..090acfd
Binary files /dev/null and b/classes/day/clos$new_object$thiz__556$fn__561.class differ
diff --git a/classes/day/clos$new_object$thiz__556.class b/classes/day/clos$new_object$thiz__556.class
new file mode 100644
index 0000000..2d155ae
Binary files /dev/null and b/classes/day/clos$new_object$thiz__556.class differ
diff --git a/classes/day/clos$new_object$thiz__633$fn__638.class b/classes/day/clos$new_object$thiz__633$fn__638.class
new file mode 100644
index 0000000..92ec97e
Binary files /dev/null and b/classes/day/clos$new_object$thiz__633$fn__638.class differ
diff --git a/classes/day/clos$new_object$thiz__633.class b/classes/day/clos$new_object$thiz__633.class
new file mode 100644
index 0000000..fbe1edc
Binary files /dev/null and b/classes/day/clos$new_object$thiz__633.class differ
diff --git a/classes/day/clos$new_object$thiz__728$fn__733.class b/classes/day/clos$new_object$thiz__728$fn__733.class
new file mode 100644
index 0000000..58253f1
Binary files /dev/null and b/classes/day/clos$new_object$thiz__728$fn__733.class differ
diff --git a/classes/day/clos$new_object$thiz__728.class b/classes/day/clos$new_object$thiz__728.class
new file mode 100644
index 0000000..7ccc2e2
Binary files /dev/null and b/classes/day/clos$new_object$thiz__728.class differ
diff --git a/classes/day/clos$new_object$thiz__776$fn__781.class b/classes/day/clos$new_object$thiz__776$fn__781.class
new file mode 100644
index 0000000..4a1be8d
Binary files /dev/null and b/classes/day/clos$new_object$thiz__776$fn__781.class differ
diff --git a/classes/day/clos$new_object$thiz__776.class b/classes/day/clos$new_object$thiz__776.class
new file mode 100644
index 0000000..929a850
Binary files /dev/null and b/classes/day/clos$new_object$thiz__776.class differ
diff --git a/classes/day/clos$new_object$thiz__814$fn__819.class b/classes/day/clos$new_object$thiz__814$fn__819.class
new file mode 100644
index 0000000..12ccc6a
Binary files /dev/null and b/classes/day/clos$new_object$thiz__814$fn__819.class differ
diff --git a/classes/day/clos$new_object$thiz__814.class b/classes/day/clos$new_object$thiz__814.class
new file mode 100644
index 0000000..fc3431f
Binary files /dev/null and b/classes/day/clos$new_object$thiz__814.class differ
diff --git a/classes/day/clos$new_object.class b/classes/day/clos$new_object.class
new file mode 100644
index 0000000..ada9424
Binary files /dev/null and b/classes/day/clos$new_object.class differ
diff --git a/classes/day/clos__init.class b/classes/day/clos__init.class
new file mode 100644
index 0000000..70045af
Binary files /dev/null and b/classes/day/clos__init.class differ
diff --git a/classes/day/core$def_form.class b/classes/day/core$def_form.class
new file mode 100644
index 0000000..a6d7dda
Binary files /dev/null and b/classes/day/core$def_form.class differ
diff --git a/classes/day/core$foo.class b/classes/day/core$foo.class
new file mode 100644
index 0000000..51a9869
Binary files /dev/null and b/classes/day/core$foo.class differ
diff --git a/classes/day/core$infix.class b/classes/day/core$infix.class
new file mode 100644
index 0000000..8202043
Binary files /dev/null and b/classes/day/core$infix.class differ
diff --git a/classes/day/core$loading__4410__auto__.class b/classes/day/core$loading__4410__auto__.class
new file mode 100644
index 0000000..1606179
Binary files /dev/null and b/classes/day/core$loading__4410__auto__.class differ
diff --git a/classes/day/core$my_declare$fn__565.class b/classes/day/core$my_declare$fn__565.class
new file mode 100644
index 0000000..63cf916
Binary files /dev/null and b/classes/day/core$my_declare$fn__565.class differ
diff --git a/classes/day/core$my_declare$fn__598.class b/classes/day/core$my_declare$fn__598.class
new file mode 100644
index 0000000..0d950ab
Binary files /dev/null and b/classes/day/core$my_declare$fn__598.class differ
diff --git a/classes/day/core$my_declare$fn__721.class b/classes/day/core$my_declare$fn__721.class
new file mode 100644
index 0000000..a8f2a8d
Binary files /dev/null and b/classes/day/core$my_declare$fn__721.class differ
diff --git a/classes/day/core$my_declare.class b/classes/day/core$my_declare.class
new file mode 100644
index 0000000..fcc0568
Binary files /dev/null and b/classes/day/core$my_declare.class differ
diff --git a/classes/day/core$my_declare_1.class b/classes/day/core$my_declare_1.class
new file mode 100644
index 0000000..018c095
Binary files /dev/null and b/classes/day/core$my_declare_1.class differ
diff --git a/classes/day/core$my_declare_2$iter__601__605$fn__606$fn__607.class b/classes/day/core$my_declare_2$iter__601__605$fn__606$fn__607.class
new file mode 100644
index 0000000..ae7f170
Binary files /dev/null and b/classes/day/core$my_declare_2$iter__601__605$fn__606$fn__607.class differ
diff --git a/classes/day/core$my_declare_2$iter__601__605$fn__606.class b/classes/day/core$my_declare_2$iter__601__605$fn__606.class
new file mode 100644
index 0000000..f92130d
Binary files /dev/null and b/classes/day/core$my_declare_2$iter__601__605$fn__606.class differ
diff --git a/classes/day/core$my_declare_2$iter__601__605.class b/classes/day/core$my_declare_2$iter__601__605.class
new file mode 100644
index 0000000..f214812
Binary files /dev/null and b/classes/day/core$my_declare_2$iter__601__605.class differ
diff --git a/classes/day/core$my_declare_2$iter__724__728$fn__729$fn__730.class b/classes/day/core$my_declare_2$iter__724__728$fn__729$fn__730.class
new file mode 100644
index 0000000..389f9f6
Binary files /dev/null and b/classes/day/core$my_declare_2$iter__724__728$fn__729$fn__730.class differ
diff --git a/classes/day/core$my_declare_2$iter__724__728$fn__729.class b/classes/day/core$my_declare_2$iter__724__728$fn__729.class
new file mode 100644
index 0000000..29ea406
Binary files /dev/null and b/classes/day/core$my_declare_2$iter__724__728$fn__729.class differ
diff --git a/classes/day/core$my_declare_2$iter__724__728.class b/classes/day/core$my_declare_2$iter__724__728.class
new file mode 100644
index 0000000..3872ceb
Binary files /dev/null and b/classes/day/core$my_declare_2$iter__724__728.class differ
diff --git a/classes/day/core$my_declare_2.class b/classes/day/core$my_declare_2.class
new file mode 100644
index 0000000..f756101
Binary files /dev/null and b/classes/day/core$my_declare_2.class differ
diff --git a/classes/day/core$unless.class b/classes/day/core$unless.class
new file mode 100644
index 0000000..8dd32e9
Binary files /dev/null and b/classes/day/core$unless.class differ
diff --git a/classes/day/core$unless_amit.class b/classes/day/core$unless_amit.class
new file mode 100644
index 0000000..a4c4fa2
Binary files /dev/null and b/classes/day/core$unless_amit.class differ
diff --git a/classes/day/core$unless_do.class b/classes/day/core$unless_do.class
new file mode 100644
index 0000000..92e9dc4
Binary files /dev/null and b/classes/day/core$unless_do.class differ
diff --git a/classes/day/core$unless_full.class b/classes/day/core$unless_full.class
new file mode 100644
index 0000000..215775f
Binary files /dev/null and b/classes/day/core$unless_full.class differ
diff --git a/classes/day/core__init.class b/classes/day/core__init.class
new file mode 100644
index 0000000..825fb1b
Binary files /dev/null and b/classes/day/core__init.class differ
diff --git a/classes/day/macmac$loading__4410__auto__.class b/classes/day/macmac$loading__4410__auto__.class
new file mode 100644
index 0000000..caa686c
Binary files /dev/null and b/classes/day/macmac$loading__4410__auto__.class differ
diff --git a/classes/day/macmac$make_synonym.class b/classes/day/macmac$make_synonym.class
new file mode 100644
index 0000000..f950e2c
Binary files /dev/null and b/classes/day/macmac$make_synonym.class differ
diff --git a/classes/day/macmac__init.class b/classes/day/macmac__init.class
new file mode 100644
index 0000000..abe39e6
Binary files /dev/null and b/classes/day/macmac__init.class differ
diff --git a/clojure-contrib-src.jar b/clojure-contrib-src.jar
new file mode 100644
index 0000000..f9413a3
Binary files /dev/null and b/clojure-contrib-src.jar differ
diff --git a/clojure-contrib.jar b/clojure-contrib.jar
new file mode 100644
index 0000000..9765dd7
Binary files /dev/null and b/clojure-contrib.jar differ
diff --git a/clojure-src.jar b/clojure-src.jar
new file mode 100644
index 0000000..b29a226
Binary files /dev/null and b/clojure-src.jar differ
diff --git a/clojure.jar b/clojure.jar
new file mode 100644
index 0000000..82b549d
Binary files /dev/null and b/clojure.jar differ
diff --git a/src/day/advanced.clj b/src/day/advanced.clj
new file mode 100644
index 0000000..0fb9faa
--- /dev/null
+++ b/src/day/advanced.clj
@@ -0,0 +1,27 @@
+(ns day.advanced)
+
+#_ (my-let [x 10
+ y x
+ z (+ x y)]
+ (* x y z))
+
+(defmacro single-arg-fn [[v expr] & body]
+ `((fn [~v] ~@body) ~expr))
+
+(defmacro my-let [lettings & body]
+ (let [helper (fn
+ ([] `(do ~@body))
+ ([v expr & more]
+ `(single-arg-fn [~v ~expr]
+ (my-let ~more ~@body))))]
+ (apply helper lettings)))
+
+;; (extend-fn f [x y z] (* x y z))
+(defmacro extend-fn [name args & body]
+ `(let [old-fn# (var-get (var ~name))
+ new-fn# (fn ~args (do ~@body))
+ dispatcher# (fn [& more#]
+ (if (= ~(count args) (count more#))
+ (apply new-fn# more#)
+ (apply old-fn# more#)))]
+ (alter-var-root (var ~name) (constantly dispatcher#))))
diff --git a/src/day/anaphora.clj b/src/day/anaphora.clj
new file mode 100644
index 0000000..549f53d
--- /dev/null
+++ b/src/day/anaphora.clj
@@ -0,0 +1,31 @@
+(ns day.anaphora)
+
+;; ~'x => capture x as variable
+
+#_(anaphoric-if (some-computation 11)
+ (* 2 it))
+
+(defn some-computation [x] (if (even? x) false (inc x)))
+
+(defmacro anaphoric-if [expr & body]
+ `(if-let [~'it ~expr] (do ~@body)))
+
+(defmacro anaphoric-and
+ ([] true)
+ ([x] x)
+ ([x & more]
+ `(anaphoric-if ~x
+ (anaphoric-and ~@more))))
+
+(defmacro with-it [f a & more]
+ `(let [~'it ~a]
+ (~f ~'it ~@more)))
+
+(defmacro a-if [a & more]
+ `(with-it if ~a ~@more))
+
+(defmacro thread-it
+ ([x] x)
+ ([x & more]
+ `(let [~'it ~x]
+ (thread-it ~@more))))
\ No newline at end of file
diff --git a/src/day/clos.clj b/src/day/clos.clj
new file mode 100644
index 0000000..5717f92
--- /dev/null
+++ b/src/day/clos.clj
@@ -0,0 +1,59 @@
+(ns day.clos)
+
+(def this)
+
+(defn method-call [klass m-name args]
+ (if klass
+ (let [m (m-name (klass :methods))]
+ (if m
+ (apply m args)
+ (method-call (klass :parent) m-name args)))
+ (throw (RuntimeException. (str "Unable to find method named " m-name)))))
+
+(defn new-object [klass]
+ (let [state (atom {})]
+ (fn thiz [c & args]
+ (binding [this thiz]
+ (condp = c
+ :class klass
+ :class-name (klass :name)
+ :set! (let [[k v] args]
+ (dosync
+ (alter state assoc k v)))
+ :get (let [[k] args]
+ (state k))
+ (method-call klass c args))))))
+
+(defn new-class [class-name methods parent]
+ (fn thiz [c & args]
+ (condp = c
+ :name (name class-name)
+ :new (new-object thiz)
+ :methods methods
+ :parent parent)))
+
+(defn method-spec [[mname args & body]]
+ `{~(keyword mname) (fn ~args ~@body)})
+
+(defmacro defclass [c-name & body]
+ (let [m-specs (map rest (filter #(= (first %) 'method) body))
+ methods (apply merge (map method-spec m-specs))
+ parent (last (apply merge (filter #(= (first %)'extends) body)))]
+ `(def ~c-name (new-class (keyword '~c-name) ~methods ~parent))))
+
+;; examples
+
+(defclass Animal
+ (method make-sound [] (str "SOUND!")))
+
+(defclass Person
+ (extends Animal)
+ (method say-hello [n] (str "Hello " n "!")))
+
+(def siva (Person :new))
+
+(siva :class-name)
+
+(siva :make-sound)
+
+(siva :say-hello "Sean")
\ No newline at end of file
diff --git a/src/day/core.clj b/src/day/core.clj
new file mode 100644
index 0000000..90d9b33
--- /dev/null
+++ b/src/day/core.clj
@@ -0,0 +1,31 @@
+(ns day.core)
+
+;; cannot define unless as a function because args
+;; are evaluated eagerly, not lazily...
+(defmacro unless [p body]
+ `(if ~p nil ~body))
+
+(defmacro unless-amit [expr form]
+ (list 'if expr nil form))
+
+(defmacro unless-do [expr & forms]
+ `(if ~expr nil (do ~@forms)))
+
+(defmacro foo [ & f]
+ `(let [a# (inc 1)]
+ (println 'a# 'f ~@f)))
+
+(defmacro my-declare [ & vars]
+ `(do ~@(map #(list 'def %) vars)))
+
+(defmacro my-declare-2 [ & vars]
+ `(do ~@(for [v# vars] (list 'def v#))))
+
+(defn def-form [x]
+ `(def ~x))
+
+(defmacro my-declare-1 [ & vars]
+ `(do ~@(map def-form vars)))
+
+(defmacro infix [a op b]
+ `(~op ~a ~b))
\ No newline at end of file
diff --git a/src/day/macmac.clj b/src/day/macmac.clj
new file mode 100644
index 0000000..4cbafd6
--- /dev/null
+++ b/src/day/macmac.clj
@@ -0,0 +1,7 @@
+(ns day.macmac)
+
+;; (make-synonym b binding) for example
+
+(defmacro make-synonym [name orig]
+ `(defmacro ~name [& ~'stuff]
+ `(~'~orig ~@~'stuff)))
\ No newline at end of file