2011-10-24 10 views

Respuesta

40

(every? f data)[docs] es la misma que all(f(x) for x in data).

(some f data)[docs] es como any(f(x) for x in data) excepto que devuelve el valor de f(x) (que debe ser Truthy), en lugar de sólo true.

Si desea el mismo comportamiento que en Python, puede usar la función identity, que simplemente devolverá su argumento (equivalente a (fn [x] x)).

user=> (every? identity [1, true, "non-empty string"]) 
true 
user=> (some identity [1, true "non-empty string"]) 
1 
user=> (some true? [1, true "non-empty string"]) 
true 
+0

¡Exactamente lo que estaba buscando, gracias! – TorelTwiddler

+3

Creo que usar la función de identidad en lugar de una nueva anónima sería mejor. ej. (every? identity [1, true, "non-empty-string"]), (some identity [1, true, "non-empty-string"]) ... –

+0

+1 para el comentario de Verneri sobre el uso de la identidad. Es más idiomático. – Gert

3

En clojure and y or son bastante similares a pitón de all y any, con la salvedad de que (al igual que clojure.core/some) devuelven el elemento que se satifsy que ... por lo tanto se puede utilizar junto con boolean a convertirlo

(boolean (or "" nil false)) ; "" is truthy in clojure 
; => true 
(boolean (and [] "" {}() 0)) ; also [], {},() and 0 are truthy 
; => true 

utilizo boolean en lugar de true? ya que este último volverá true si y sólo si el argumento es el verdadero valor ... así es más boolean similar a la serpiente pitón de bool en que se evalúa la truthyness

A diferencia some & every?, and & or son macros, por lo que si uno siempre quiere convertir el resultado a un valor lógico, no se puede simplemente hacer (def any (comp boolean or)) pero hay que definir una macro como

(defmacro any [& v] `(boolean (or [email protected]))) 
(defmacro all [& v] `(boolean (and [email protected]))) 

un efecto secundario/ventaja de ser macros, es que son perezosos/puede cortocircuitos en (al igual que del pitón and & or, que son operadores infijos binarios sin embargo)

(any "" (/ 1 0)) 
; => true 
(all nil (/ 1 0)) 
; => false 

y ellos son como pitón de any y all, incluso cuando se llama sin argumentos

(any) 
; => false 
(all) 
; => true 

en Python:

>>> any([]) 
False  
>>> all([]) 
True 

Si usted prefiere tener que llamar any/all con una sola lista/argumento de secuencia, simplemente puede hacer:

(defmacro all [v] `(boolean (and [email protected]))) 

(all []) 
; => true 
(all [nil (/ 1 0)])  
; => false 
Cuestiones relacionadas