2012-02-09 26 views
22

Khi đóng, làm cách nào chúng tôi có thể áp dụng and hoặc bất kỳ macro nào khác vào danh sách?Trong clojure, làm thế nào để áp dụng 'và' vào một danh sách?

này không hoạt động:

(apply and '(true false)) 

apply không thể lấy giá trị của một vĩ mô.

Vì vậy, cách tốt nhất để kiểm tra xem tất cả các thành phần của danh sách có đúng không?

+0

thể trùng lặp của [ "giảm" hoặc "áp dụng" sử dụng các hàm logic trong Clojure] (http://stackoverflow.com/questions/2891707/ giảm hoặc áp dụng-sử dụng-logic-chức năng-in-clojure) – amalloy

Trả lời

33

Bạn có thể làm điều này thay vì:

(every? identity '(true false)) 

Xem this thread để biết thêm thông tin.

6

Trong Clojure macro không phải là thứ hạng nhất chúng không soạn khá giống các hàm và bạn không thể chuyển chúng sang các hàm khác và bạn không thể apply chúng. Điều này là bởi vì họ đã hoàn thành và thực hiện với trước khi bất kỳ việc áp dụng sẽ được thực hiện.

Đó là phong tục để macro bọc trong các chức năng để apply hoặc vượt qua chúng để chức năng

(defmacro my-macro [x y z] ...) 

(apply #(my-macro %1 %2 %3) [1 2 3]) 

(map #(my-macro) [1 2 3] [:a :b :c] [a b c]) 

người đọc anonymous-chức năng vĩ mô #( làm cho điều này dễ dàng như vậy mà macroes không phải là lớp học đầu tiên thực sự không phải là một sự bất tiện . Chỉ cần cố gắng remember the first rule of macro club

+1

Nhưng cách tiếp cận này sẽ sụp đổ khi macro nhận được một số biến của các đối số. – viebel

+0

bạn đang vi phạm quy tắc đầu tiên của câu lạc bộ macro ... yea, ngay cả khi sự rò rỉ trừu tượng macro :( –

0

Bạn cũng có thể làm điều này: (apply = true '(true false))

0
user=> (eval `(and [email protected](list true false))) 

false 

user=> (eval `(and [email protected] (list true true 1))) 

1 

Tôi cú pháp-trích dẫn và sau đó áp dụng một cái búa tạ lớn để loại bỏ các dấu ngoặc xung quanh việc thu thập và kể từ khi tôi trích dẫn nó, có để sử dụng eval. Điều này rất hữu ích nếu bạn đang tạo macro và hàm được truyền vào là 'và'.

vì vậy (list 1 2 3) tạ được đóng thành 1 2 3.

Đây là một cách, cực kỳ khủng khiếp, nhưng nó hoạt động, vì vậy tôi nhận được rằng sẽ cho tôi mà là tốt đẹp. Vì vậy, clojure của tôi là không lớn nhưng tôi hy vọng ví dụ vĩ mô này xóa mọi thứ lên.

(defmacro split-my-args-then-apply-fn 
    "This is one terrible macro designed to show the use of 'and'." 
    [fun coll & args] 
    `(~fun [email protected]((apply juxt args) coll))) 

sử dụng (Không bao giờ):

(split-my-args-then-apply-fn 
    and 
    {:something :true :something-else false} 
    :something :something-else) 
Các vấn đề liên quan