2011-10-24 17 views

答えて

40

(every? f data)docsall(f(x) for x in data)と同じです。

(some f data)[docs]はそれだけでなくtrueの、(truthyでなければならない)f(x)の値を返すことを除いてany(f(x) for x in data)ようなものです。

Pythonと全く同じ動作をしたい場合は、に相当する引数を返すだけのidentity関数を使用できます。 Clojureのandor

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

まさに私が探していたものです、ありがとう! – TorelTwiddler

+3

私は新しい匿名の代わりにアイデンティティ関数を使うのが良いと思います。 (あるID(1、真、非空文字列))... –

+0

IDを使うことについてのVerneriのコメントのために+1。それはより慣用的です。 – Gert

3

彼らはこのようにあなたがbooleanへと一緒に使用することができます...それをsatifsyます要素を返す(ちょうどclojure.core/someのような)ことを警告して、Pythonのallanyと非常によく似ていますそう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 & orsome & 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のanyallのようにしている:

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

あなたはany/all呼び出す必要がありますことを好む場合1つのリスト/シーケンス引数を指定するだけで、簡単に行うことができます:

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

(all []) 
; => true 
(all [nil (/ 1 0)])  
; => false 
関連する問題