2011-10-27 4 views
14

단일 값에 두 (또는 그 이상)의 조건자를 적용하려고합니다. 그것을 않습니다,하지만 난이 적용되는 조건을 구성 할 경우 어떻게clojure에서 두 개 이상의 술어를 작성하는 방법은 무엇입니까?

(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")'를 할 때 예외를 throw합니다. 나는'과'가하는 방식을 단락시키는 방법을 생각할 수 없다. – stand

관련 문제