2011-10-27 9 views
14

1つの値に2つ(またはそれ以上)の述語を適用したいとします。それをしないが、私は適用述語を構成したい場合はどのようなclojureで2つ以上の述語をどのように作成しますか?

(defn posint? [n] 
    (and (integer? n) (pos? n))) 

:たとえば、私は値が正の整数であるかどうかをテストしたいと言いますか?私は述語の可能な組み合わせごとに関数を書いたくありません。

答えて

20

だけでこれを行うにevery-predと呼ばれる組み込み関数が実際にそこにあるのClojure 1.3で。 hereを参照してください。

(defn posint? [n] 
    ((every-pred integer? pos?) n)) 
+0

これは '(posint?" a ")'!私は残念ながら1.2解決策が必要です。 – stand

+2

@stand:Clojureのソースからこの機能を利用してコードに入れることができると思います –

2

これらのチェックをインラインで実行する場合は、次のようなものがあります。

(defn predicate-test [fns t] 
    "test all predicates against value t and return true iff all predicates return true." 
    (every? true? ((apply juxt fns) t))) 

(predicate-test [integer? pos?] 4) 

あなたは、あなたの最も使用される述語のテストのためにという名前のバージョンを作成することができます。

(def posint? (partial predicate-test [integer? pos?]) 

(posint? 4) 
+0

ああ、それは私が行方不明だった 'juxt'関数でした。ありがとう! – stand

+0

... 'pos?'が 'CastException'を投げたので'(posint? "a") 'を実行すると、この解決策は例外をスローします。 'と'のやり方を短絡する方法は考えられない。 – stand

関連する問題