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