aboutsummaryrefslogtreecommitdiff
path: root/src/clojure
diff options
context:
space:
mode:
authorKonrad Hinsen <konrad.hinsen@laposte.net>2009-05-25 08:17:36 +0000
committerKonrad Hinsen <konrad.hinsen@laposte.net>2009-05-25 08:17:36 +0000
commit92b44eae2e4d17f1115f65abd327ab45af684c8a (patch)
tree63656da1e6fd909f5eefd69beed151c664f6def0 /src/clojure
parentd9049bf729b37cd6d21022674d966bec31bcb7a7 (diff)
macro-utils: new macro deftemplate
Diffstat (limited to 'src/clojure')
-rw-r--r--src/clojure/contrib/macro_utils.clj14
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]