【发布时间】:2015-02-09 23:07:18
【问题描述】:
我想使用 for 宏处理任意数量的列表。我想创建一个将向量作为绑定传递的函数,因为列表的数量会有所不同。
如果我对绑定进行硬编码,它会按预期工作:
=> (def list1 '("pink" "green"))
=> (def list2 '("dog" "cat"))
=> (for [A list1 B list2] (str A "-" B))
("pink-dog" "pink-cat" "green-dog" "green-cat")
当我尝试单独创建一个向量并将其用作绑定时,我遇到了问题。这里我手动创建绑定向量:
=> (def testvector (vec (list 'A list1 'B list2)))
这看起来不错:
=> testvector
[A ("pink" "green") B ("dog" "cat")]
=> (class testvector)
clojure.lang.PersistentVector
然而,
=> (for testvector (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding (NO_SOURCE_FILE:36)>
我不明白为什么 testvector 在用作 for 中的绑定时不被视为向量。抓住稻草,我将 testvector 放在方括号中,这使 for 宏保持快乐(它看到一个向量)但现在我有一个带有一个元素的向量(即向量中的一个向量),这不起作用,因为绑定需要是名称和集合的对。
=> (for [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an even number of forms in binding vector (NO_SOURCE_FILE:37)>
任何关于如何将向量作为绑定动态传递给 for 的建议都将不胜感激。
【问题讨论】:
-
(vec (list ...)) 可以更简单地写成 (vector ...)。
标签: binding clojure list-comprehension