我有一個任意數量的列表,我想用宏來處理。我想創建一個傳遞一個向量作爲綁定的函數,因爲列表數目有所不同。傳遞一個向量作爲綁定到宏的問題
如果我硬編碼的結合,它的工作原理如我所料:
=> (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 [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an even number of forms in binding vector (NO_SOURCE_FILE:37)>
任何關於如何動態地傳遞一個向量作爲綁定的建議將不勝感激。
(vec(list ...))可以簡單寫成(vector ...)。 – kotarak 2010-07-15 11:59:40