aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Sierra <mail@stuartsierra.com>2008-12-16 15:18:16 +0000
committerStuart Sierra <mail@stuartsierra.com>2008-12-16 15:18:16 +0000
commit5e0ebee315551ad59470219287da4ec0bc7995ca (patch)
tree611a24ed3449b89ad02845f0ad9d61e2ccb60e9f
parent68d81a761e9459389266c2f6ddee8e3c36ebc38f (diff)
template.clj: fixed missing chunk in template macro
-rw-r--r--src/clojure/contrib/template.clj16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/clojure/contrib/template.clj b/src/clojure/contrib/template.clj
index 47b51953..09028e2d 100644
--- a/src/clojure/contrib/template.clj
+++ b/src/clojure/contrib/template.clj
@@ -94,9 +94,19 @@
as _1). Any sub-expressions without any _* variables are evaluated
when the fn is created, not when it is called."
[& form]
- `(let ~(flatten-map (clojure.set/map-invert newmap))
- (fn ~(vec holes)
- ~@newform)))
+ (let [form (postwalk-replace {'_ '_1} form)
+ holes (find-holes form)
+ pures (find-pure-exprs form)
+ smap (zipmap pures (repeatedly #(gensym "HOLE_")))
+ newform (prewalk-replace smap form)
+ ;; Now, make sure we omit nested sub-expressions:
+ used (set (filter #(.startsWith (name %) "HOLE_")
+ (find-symbols newform)))
+ newmap (reduce (fn [m [k v]] (if (used v) (assoc m k v) m))
+ {} smap)]
+ `(let ~(flatten-map (clojure.set/map-invert newmap))
+ (fn ~(vec holes)
+ ~@newform))))
(defn apply-template
"Replaces _1, _2, _3, etc. in expr with corresponding elements of