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

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to