diff options
author | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-05-25 08:17:36 +0000 |
---|---|---|
committer | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-05-25 08:17:36 +0000 |
commit | 92b44eae2e4d17f1115f65abd327ab45af684c8a (patch) | |
tree | 63656da1e6fd909f5eefd69beed151c664f6def0 /src/clojure | |
parent | d9049bf729b37cd6d21022674d966bec31bcb7a7 (diff) |
macro-utils: new macro deftemplate
Diffstat (limited to 'src/clojure')
-rw-r--r-- | src/clojure/contrib/macro_utils.clj | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/clojure/contrib/macro_utils.clj b/src/clojure/contrib/macro_utils.clj index 191f07f7..a243a5f9 100644 --- a/src/clojure/contrib/macro_utils.clj +++ b/src/clojure/contrib/macro_utils.clj @@ -1,7 +1,7 @@ ;; Macrolet and symbol-macrolet ;; by Konrad Hinsen -;; last updated May 5, 2009 +;; last updated May 25, 2009 ;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. The use ;; and distribution terms for this software are covered by the Eclipse @@ -211,6 +211,18 @@ [& exprs] `(do ~@(doall (map expand-all exprs)))) +(defmacro deftemplate + "Define a macro that expands into forms after replacing the + symbols in params (a vector) by the corresponding parameters + given in the macro call." + [name params & forms] + (let [param-map (for [p params] (list (list 'quote p) (gensym))) + template-params (vec (map second param-map)) + param-map (vec (apply concat param-map)) + expansion (list 'list (list 'quote `symbol-macrolet) param-map + (list 'quote (cons 'do forms)))] + `(defmacro ~name ~template-params ~expansion))) + (defn mexpand-1 "Like clojure.core/macroexpand-1, but takes into account symbol macros." [form] |