diff options
author | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-05-05 15:48:03 +0000 |
---|---|---|
committer | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-05-05 15:48:03 +0000 |
commit | 8b8935826f5c97d7759df5fad8da1a6d45b2f1aa (patch) | |
tree | d4955f994423376dba6b905e53ace1548576e444 /src/clojure | |
parent | dbb8c617a842103d671c0d7cf692aab4387a5717 (diff) |
macro-utils: fixed expansion of symbol macros in the first position of a list
Diffstat (limited to 'src/clojure')
-rw-r--r-- | src/clojure/contrib/macro_utils.clj | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/clojure/contrib/macro_utils.clj b/src/clojure/contrib/macro_utils.clj index 23fb27c0..191f07f7 100644 --- a/src/clojure/contrib/macro_utils.clj +++ b/src/clojure/contrib/macro_utils.clj @@ -47,32 +47,41 @@ ; Symbols defined inside let forms or function arguments. (defvar- protected-symbols #{}) +(defn- reserved? + [symbol] + "Return true if symbol is a reserved symbol (starting or ending with a dot)." + (let [s (str symbol)] + (or (= "." (subs s 0 1)) + (= "." (subs s (dec (count s))))))) + +(defn- expand-symbol + "Expand symbol macros" + [symbol] + (cond (contains? protected-symbols symbol) symbol + (reserved? symbol) symbol + (contains? macro-symbols symbol) (get macro-symbols symbol) + :else (let [v (resolve symbol) + m (meta v)] + (if (:symbol-macro m) + (var-get v) + symbol)))) + (defn- expand-1 "Perform a single non-recursive macro expansion of form." [form] (cond (seq? form) (let [f (first form)] - (cond (contains? special-forms f) - form - (contains? macro-fns f) - (apply (get macro-fns f) (rest form)) - (contains? macro-symbols f) - (cons (get macro-symbols f) (rest form)) - :else - ; handle defmacro macros and Java method special forms - (clojure.core/macroexpand-1 form))) + (cond (contains? special-forms f) form + (contains? macro-fns f) (apply (get macro-fns f) (rest form)) + (symbol? f) (let [exp (expand-symbol f)] + (if (= exp f) + (clojure.core/macroexpand-1 form) + (cons exp (rest form)))) + ; handle defmacro macros and Java method special forms + :else (clojure.core/macroexpand-1 form))) (symbol? form) - (cond (contains? protected-symbols form) - form - (contains? macro-symbols form) - (get macro-symbols form) - :else - (let [v (resolve form) - m (meta v)] - (if (:symbol-macro m) - (var-get v) - form))) + (expand-symbol form) :else form)) |