在我的回答对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)))
我想删除了“”重复。我写了下面的宏:
(defmacro combine [times]
(let [symbols (repeatedly times gensym)
for-params (vec (interleave symbols (repeat 'all-letters)))]
`(for ~for-params (kw [email protected]))))
与工程:
(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)
这是怎么回事上?有没有更好的方法来消除重复?
这是因为“for”也是一个宏吗? – DanLebrero 2012-07-17 23:17:26
'for'不是造成这个问题的原因,它是一个宏,但它具有你在运行时期望的效果 - 真正的问题是'i',它是编译时用于'combine宏。增加了一些更多的解释性说明。 – mikera 2012-07-17 23:25:20