我有很多不确定数量的列表,我想使用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)>
我不明白为什么在for循环中使用testvector作为绑定变量时它不被视为向量。我尝试着抓住了一些东西,将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 ...)
。 - kotarak