Ho un numero arbitrario di elenchi che desidero elaborare utilizzando la macro per. Voglio creare una funzione che superi un vettore come associazione poiché varia il numero di elenchi.Problema con il passaggio di un vettore come associazione alla macro per
Se codificare l'associazione, funziona come mi aspetto:
=> (def list1 '("pink" "green"))
=> (def list2 '("dog" "cat"))
=> (for [A list1 B list2] (str A "-" B))
("pink-dog" "pink-cat" "green-dog" "green-cat")
Quando cerco di creare un vettore separatamente e utilizzare questo come il legame mi ha colpito problemi. Qui ho creare manualmente il binding vettore:
=> (def testvector (vec (list 'A list1 'B list2)))
questo sembra benissimo:
=> testvector
[A ("pink" "green") B ("dog" "cat")]
=> (class testvector)
clojure.lang.PersistentVector
Tuttavia,
=> (for testvector (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding (NO_SOURCE_FILE:36)>
Non capisco il motivo per cui testvector non è considerato un vettore quando viene utilizzato come vincolante in. Afferrando le cannucce, metto il testvector tra parentesi quadre che mantiene felice la macro (vede un vettore) ma ora ho un vettore con un elemento (cioè un vettore all'interno di un vettore) e questo non funziona perché il legame deve essere coppie di nome e collezione.
=> (for [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an even number of forms in binding vector (NO_SOURCE_FILE:37)>
Qualsiasi suggerimento su come passare dinamicamente un vettore come binding a per sarebbe apprezzato.
(vec (elenco ...)) può essere più semplice scritto come (vettore ...). – kotarak