Hi, Am 23.12.2008 um 17:08 schrieb Rich Hickey:
SVN 1184 implements this. Feedback welcome on its utility for macro writers.
Many Thanks Rich!
Here is a half-baked quasiquote macro ripped out of the
syntax-quote reader:
(defmacro quasiquote
[form]
(let [unquote? (fn [f] (and (seq? f) (= (first f) `unquote)))
self-eval? (fn [f] (or (keyword? f)
(number? f)
(instance? Character f)
(string? f)))
flatten-map (fn [m] (reduce (fn [r e]
(-> r (conj (key e)) (conj (val
e))))
[] m))
qq (fn qq [form]
(cond
(self-eval? form) form
(unquote? form) (second form)
(symbol? form) (list 'quote form)
(vector? form) (vec (map qq form))
(map? form) (apply hash-map
(map qq (flatten-map
form)))
(set? form) (apply hash-set (map qq
form))
(seq? form) (list* `list (map qq form))
:else (list 'quote form)))]
(qq form)))
With some example application:
Gorilla=> (def abc 5)
#'user/abc
Gorilla=> (let [fgh 6] (quasiquote (+ ~abc ~(+ abc fgh) xyz)))
(+ 5 11 xyz)
Sincerely
Meikel
smime.p7s
Description: S/MIME cryptographic signature
