2011-10-24 11 views

risposta

40

(every? f data)[docs] è lo stesso di all(f(x) for x in data).

(some f data)[docs] è come any(f(x) for x in data) eccetto che restituisce il valore di f(x) (che deve essere truthy), invece di true.

Se si desidera esattamente lo stesso comportamento di Python, è possibile utilizzare la funzione identity, che restituirà l'argomento (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

Esattamente quello che stavo cercando, grazie! – TorelTwiddler

+3

Penso che usin funzione di identità invece di nuovo anonimo sarebbe meglio. es. (ogni? identity [1, true, "non-empty-string"]), (qualche identità [1, true, "non-empty-string"]) ... –

+0

+1 per il commento di Verneri sull'utilizzo dell'identità. È più idiomatico. – Gert

3

In clojure and e or sono molto simili a pitone di all e any, con l'avvertenza che (proprio come clojure.core/some) tornano l'elemento che satifsy esso ... quindi è possibile utilizzarlo insieme a boolean convertirlo

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

io uso boolean invece di true? dal momento che quest'ultima tornerà true se e solo se l'argomento è il valore vero ... così è più boolean simile a pitone di bool in quanto valuta la truthyness

differenza some & every?, and & or sono le macro, quindi se si vuole sempre per convertire il risultato a un valore booleano, non si può semplicemente fare (def any (comp boolean or)) ma è necessario definire una macro come

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

un effetto collaterale/vantaggio di macro, è che sono pigri/può dai cortocircuiti (come del pitone and & or, che sono operatori infisso binari tuttavia)

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

e sono proprio come pitone di any e all, anche quando viene chiamato senza argomenti

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

in python:

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

Se si preferisce avere a chiamare any/all con un solo argomento elenco/sequenza, puoi semplicemente fare:

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

(all []) 
; => true 
(all [nil (/ 1 0)])  
; => false 
Problemi correlati