Esistono funzioni incorporate in Clojure simili alle funzioni any
e all
di Python?Clojure equivalente alle funzioni "any" e "all" di Python?
Ad esempio, in Python, è all([True, 1, 'non-empty string']) == True
.
Esistono funzioni incorporate in Clojure simili alle funzioni any
e all
di Python?Clojure equivalente alle funzioni "any" e "all" di Python?
Ad esempio, in Python, è all([True, 1, 'non-empty string']) == True
.
(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
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
Esattamente quello che stavo cercando, grazie! – TorelTwiddler
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"]) ... –
+1 per il commento di Verneri sull'utilizzo dell'identità. È più idiomatico. – Gert