Added macros.clj and updated the path_to_answer_sheet & path_to_enlightenment for the same.

This commit is contained in:
Jaskirat 2011-02-08 17:21:11 +05:30
parent f29e547f2a
commit 0c0ab4e457
3 changed files with 59 additions and 1 deletions

47
src/koans/macros.clj Normal file
View File

@ -0,0 +1,47 @@
"Macros are also just functions!"
(defmacro hello [x]
(str "Hello, " x))
"Create a list and use it to be eval-ed at run time"
(defmacro infix [form]
(list (second form) (first form) (nth form 2)))
"Sometimes it is easier to handcraft it ..."
(defmacro infix-better [form]
`(~(second form)
__
__ ))
"Macro in a macro until you get a stack overflow! ;)"
(defmacro r-infix [form]
(list (second form)
(if (instance? clojure.lang.PersistentList (first form))
`(r-infix ~(first form))
(first form))
(if (instance? clojure.lang.PersistentList (nth form 2))
`(r-infix ~(nth form 2))
(nth form 2))
))
(meditations
"Macros are just function eval-ed at compile time"
(= "Hello, Macros!" (hello "Macros!"))
"Can I haz some infix?"
(= __ (infix (9 + 1)))
"Remember these are nothing but code transformations"
(= __ (macroexpand '(infix (9 + 1))))
"You can do better than that, hand crafting ftw"
(= __ (macroexpand '(infix-better (10 * 2))))
"Things dont always work as you would like them to... "
(= __ (macroexpand '(infix-better ( 10 + (2 * 3)))))
"Really, you dont understand recursion until you understand recursion"
(= __ (r-infix (10 + (2 * 3))))
)

View File

@ -133,6 +133,16 @@
] ]
"___" ['(comp exclamator exclamator exclamator) "___" ['(comp exclamator exclamator exclamator)
'(fn [x] (+ 20 x))]} '(fn [x] (+ 20 x))]}
"macros" {"__" ['~(first form)
'~(nth form 2)
10
''(+ 9 1)
''(* 10 2)
''(+ 10 (2 * 3))
16
]
}
}) })
(defn replace-with [s k replacements] (defn replace-with [s k replacements]

View File

@ -29,7 +29,8 @@
"creating_functions" "creating_functions"
"recursion" "recursion"
"destructuring" "destructuring"
"refs"]) "refs"
"macros"])
(defn require-version [[required-major required-minor]] (defn require-version [[required-major required-minor]]
(let [{:keys [major minor]} *clojure-version*] (let [{:keys [major minor]} *clojure-version*]