Tôi có một số lượng danh sách tùy ý mà tôi muốn xử lý bằng cách sử dụng macro. Tôi muốn tạo một hàm truyền một vectơ làm liên kết vì số lượng danh sách thay đổi.Sự cố khi truyền vectơ như một ràng buộc cho macro
Nếu tôi cứng mã ràng buộc, nó hoạt động như tôi mong đợi:
=> (def list1 '("pink" "green"))
=> (def list2 '("dog" "cat"))
=> (for [A list1 B list2] (str A "-" B))
("pink-dog" "pink-cat" "green-dog" "green-cat")
Khi tôi cố gắng tạo ra một vector riêng biệt và sử dụng như các ràng buộc tôi nhấn vấn đề. Ở đây tôi tự tạo các ràng buộc vector:
=> (def testvector (vec (list 'A list1 'B list2)))
này có vẻ tốt đẹp:
=> testvector
[A ("pink" "green") B ("dog" "cat")]
=> (class testvector)
clojure.lang.PersistentVector
Tuy nhiên,
=> (for testvector (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires a vector for its binding (NO_SOURCE_FILE:36)>
Tôi không hiểu tại sao testvector không được xem là một véc tơ khi sử dụng như ràng buộc trong. Nắm lấy ống hút, tôi đặt testvector trong các dấu ngoặc vuông, giữ cho macro hạnh phúc (nó nhìn thấy một vector) nhưng bây giờ tôi có một vector với một phần tử (ví dụ: vector trong vectơ) và điều này không hoạt động. là cặp tên và bộ sưu tập.
=> (for [testvector] (str A "-" B))
#<CompilerException java.lang.IllegalArgumentException: for requires an even number of forms in binding vector (NO_SOURCE_FILE:37)>
Bất kỳ đề xuất nào về cách tự động truyền véc tơ như một ràng buộc cho sẽ được đánh giá cao.
(vec (danh sách ...)) có thể được viết đơn giản dưới dạng (vectơ ...). – kotarak