在我的回答對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