I have an arbitrary number of lists which I would like to process using the for macro. I want to create a function that passes a vector as the binding since the number of lists varies.
If I hard code the binding, it works as I expect:
=> (def list1 '("pink" "green"))
=> (def list2 '("dog" "cat"))
=> (for [A list1 B list2] (str A "-" B))
("pink-dog" "pink-cat" "green-dog" "green-cat")
When I try to create a vector separately and use this as the binding I hit problems. Here I manually create the bindings vector:
=> (def testvector (vec (list 'A list1 'B list2)))
this seems fine:
=> testvector
[A ("pink" "green") B ("dog" "cat")]
=> (class testvector)
clojure.lang.PersistentVector
However,
=> (for testvector (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding (NO_SOURCE_FILE:36)>
I don't understand why testvector isn't considered a vector when used as the binding in for. Grasping at straws, I put testvector in square brackets which keeps the for macro happy (it sees a vector) but now I have a vector with one element (i.e. a vector within a vector) and this doesn't work because the binding needs to be pairs of name and collection.
=> (for [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an even number of forms in binding vector (NO_SOURCE_FILE:37)>
Any suggestions on how to dynamically pass a vector as a binding to for would be appreciated.