【发布时间】:2012-07-17 23:04:17
【问题描述】:
在我对Clojure For Comprehension example 的回答中,我想删除一些重复内容:
(def all-letters (map char (range 65 90)))
(defn kw [& args] (keyword (apply str args)))
(concat
(for [l all-letters] (kw l))
(for [l all-letters l2 all-letters] (kw l l2))
(for [l all-letters l2 all-letters l3 all-letters] (kw l l2 l3)))
我想删除“for”重复项。我写了以下宏:
(defmacro combine [times]
(let [symbols (repeatedly times gensym)
for-params (vec (interleave symbols (repeat 'all-letters)))]
`(for ~for-params (kw ~@symbols))))
适用于:
(concat (combine 1) (combine 2) (combine 3))
但如果我尝试:
(for [i (range 1 4)] (combine i))
我明白了:
CompilerException java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to java.lang.Number, compiling:(NO_SOURCE_PATH:177)
发生了什么事?有没有更好的去除重复的方法?
【问题讨论】:
标签: macros clojure code-duplication for-comprehension