Added macros.clj and updated the path_to_answer_sheet & path_to_enlightenment for the same.
This commit is contained in:
parent
f29e547f2a
commit
0c0ab4e457
47
src/koans/macros.clj
Normal file
47
src/koans/macros.clj
Normal 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))))
|
||||
|
||||
)
|
||||
|
@ -133,6 +133,16 @@
|
||||
]
|
||||
"___" ['(comp exclamator exclamator exclamator)
|
||||
'(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]
|
||||
|
@ -29,7 +29,8 @@
|
||||
"creating_functions"
|
||||
"recursion"
|
||||
"destructuring"
|
||||
"refs"])
|
||||
"refs"
|
||||
"macros"])
|
||||
|
||||
(defn require-version [[required-major required-minor]]
|
||||
(let [{:keys [major minor]} *clojure-version*]
|
||||
|
Loading…
Reference in New Issue
Block a user