У меня есть произвольное количество списков, которые я хотел бы обработать с помощью макроса 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 не считается вектором, когда используется в качестве привязки для. Схватившись за соломинку, я поместил 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)>
Буду признателен за любые предложения о том, как динамически передавать вектор в качестве привязки к.