2012-02-09 11 views
22

En el cierre, ¿cómo podemos aplicar and o cualquier otra macro a una lista?En clojure, ¿cómo aplicar 'y' a una lista?

Esto no funciona:

(apply and '(true false)) 

Debido apply no puede tomar el valor de una macro.

Entonces, ¿cuál es la mejor manera de verificar si todos los elementos de una lista son verdaderos?

+0

posible duplicado de [ "reducir" o "aplicar" usando funciones lógicas en Clojure] (http://stackoverflow.com/questions/2891707/ reduce-o-aplica-usa-funciones-lógicas-en-clojura) – amalloy

Respuesta

33

Usted puede hacer esto en su lugar:

(every? identity '(true false)) 

Ver this thread para más información.

6

En Clojure las macros no son cosas de primera clase que no componen funciones muy parecidas, y no puede pasarlas a otras funciones, y usted no puede apply ellas. Esto se debe a que están terminados y terminados antes de que se realice cualquiera de las aplicaciones.

Es costumbre macros de envoltura en funciones a apply o pasarlos a las funciones

(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]) 

el lector-función anónima macro #( hace que este tan fácil que macroes no son de primera clase no es realmente un inconveniente . Simplemente tratar de remember the first rule of macro club

+1

Pero este enfoque colapsará cuando la macro reciba una cantidad variable de argumentos. – viebel

+0

estás rompiendo la primera regla del macro club ... sí, incluso la macro abstracción pierde :( –

0

También puede hacer esto: (apply = true '(true false))

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

false 

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

1 

estoy sintaxis citando y aplicando después un gran martillo para quitar los corchetes de la colección y como yo cité, tiene usar eval Esto es útil si está creando una macro y la función transferida es 'y'.

so (list 1 2 3) mazo martillado se convierte en 1 2 3.

Esto es de una manera, extremadamente terrible, pero funciona, así que lo conseguí, lo cual es bueno. Así que mi clojure no es genial, pero espero que este macro ejemplo aclare las cosas.

(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))) 

uso (Nunca):

(split-my-args-then-apply-fn 
    and 
    {:something :true :something-else false} 
    :something :something-else) 
Cuestiones relacionadas