Trong clojure
, apply
không thể áp dụng cho macro. Ví dụ: (apply and [true false])
đặt ra một ngoại lệ. Tôi đã suy nghĩ về cách giải quyết như sau:Trong clojure, làm cách nào để áp dụng macro vào danh sách?
(defmacro apply-macro[func args] `(~func [email protected]))
Thoạt nhìn, nó dường như làm việc khá tốt:
(apply-macro and [true 5]); 5
(apply-macro and [true 5 0]); 0
(let [a 0] (apply-macro and [true a])); 0
Nhưng, khi tôi được truyền cho nó một biến trỏ đến một vector, nó sụp đổ.
(let [a [true]] (apply-macro and a)); java.lang.IllegalArgumentException:
;Don't know how to create ISeq from: clojure.lang.Symbol
Thật đáng thất vọng !!!!
Bất kỳ ý tưởng nào về cách khắc phục apply-macro
?
@YehonathanSharvit: điểm là '(áp dụng vĩ mô và a) 'được mở rộng thành' (và) 'tại ** thời gian đọc **, nhưng' a' chỉ được xác định tại ** thời gian ** đánh giá. Vì vậy, 'unquote-splicing' của' a' (tức là '~ @ a') không thành công, vì' a' chưa được xác định. –
liwp
Chắc chắn, 'a' là một vectơ tại thời gian chạy. Nhưng không sử dụng nếu bạn muốn xây dựng một biểu mẫu '(và ....)' với nội dung của 'a' tại thời gian biên dịch, vì trình biên dịch không thể thấy nội dung của' a'. Do đó bạn cần phải gọi trình biên dịch * một lần nữa * tại thời gian chạy một khi bạn biết những gì 'a' chứa, do đó sự cần thiết cho eval. Đó là một chút phức tạp nhưng hy vọng rằng logic có ý nghĩa ..... – mikera
'Functionize' có vẻ tuyệt vời !!! Bạn có phải là tác giả? Có bất kỳ hạn chế nào không? – viebel