Clojureには、Pythonのany
およびall
関数と同様の関数が組み込まれていますか?ClojureはPythonの "any"関数と "all"関数に相当しますか?
たとえば、Pythonではall([True, 1, 'non-empty string']) == True
です。
Clojureには、Pythonのany
およびall
関数と同様の関数が組み込まれていますか?ClojureはPythonの "any"関数と "all"関数に相当しますか?
たとえば、Pythonではall([True, 1, 'non-empty string']) == True
です。
(every? f data)
docsはall(f(x) for x in data)
と同じです。
(some f data)
[docs]はそれだけでなくtrue
の、(truthyでなければならない)f(x)
の値を返すことを除いてany(f(x) for x in data)
ようなものです。
Pythonと全く同じ動作をしたい場合は、に相当する引数を返すだけのidentity
関数を使用できます。 Clojureのand
とor
で
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
彼らはこのようにあなたがboolean
へと一緒に使用することができます...それをsatifsyます要素を返す(ちょうどclojure.core/some
のような)ことを警告して、Pythonのall
とany
と非常によく似ていますそうboolean
がもっとある...それは私が引数場合に限っtrue
を返します。後者ので、boolean
の代わりtrue?
使用
(boolean (or "" nil false)) ; "" is truthy in clojure
; => true
(boolean (and [] "" {}() 0)) ; also [], {},() and 0 are truthy
; => true
が真の値である変換あなたは常にブール値に結果を変換したい場合、あなたは、単に(def any (comp boolean or))
を行うことはできませんが、マクロを定義する必要がありますので、それはand
& or
、some
& every?
とは異なりtruthyness
を評価し、その中でPythonのbool
に似ては、マクロです以下のような
(defmacro any [& v] `(boolean (or [email protected])))
(defmacro all [& v] `(boolean (and [email protected])))
マクロであることの副作用/利点、彼らは/(但し中置二項演算子であること、ちょうどPythonのand
& or
のような)怠惰な短絡することができているということです
(any "" (/ 1 0))
; => true
(all nil (/ 1 0))
; => false
、彼らはPythonで
(any)
; => false
(all)
; => true
引数なしで呼び出さ場合でも、ちょうどPythonのany
とall
のようにしている:
>>> any([])
False
>>> all([])
True
あなたはany
/all
呼び出す必要がありますことを好む場合1つのリスト/シーケンス引数を指定するだけで、簡単に行うことができます:
(defmacro all [v] `(boolean (and [email protected])))
(all [])
; => true
(all [nil (/ 1 0)])
; => false
まさに私が探していたものです、ありがとう! – TorelTwiddler
私は新しい匿名の代わりにアイデンティティ関数を使うのが良いと思います。 (あるID(1、真、非空文字列))... –
IDを使うことについてのVerneriのコメントのために+1。それはより慣用的です。 – Gert