2016-09-08 3 views
4

clojure.spec의 버전이 1.9.0-alpha11 인 고위 함수를 작성하려고 시도했으나 반환 된 함수에 대해 유효성 검사를 수행하지 못했습니다.fdo에 대한 clojure.spec 유효성 확인

: 안내 한 바와 같이

(defn adder [x] #(+ x %)) 

, 난 등의 사양을 작성 : 같이 고차 함수의 clojure.spec 가이드 섹션의 예를 사용

, I는 adder 형태를 정의 나는 REPL에서 그것을 실행하면

(s/fdef adder 
    :args (s/cat :x number?) 
    :ret (s/fspec :args (s/cat :y number?) 
       :ret number?) 
    :fn #(= (-> % :args :x) ((:ret %) 0))) 

는 예외가 대신 원하는 사양 검증 오류 발생합니다 :

user> (def add2 (adder 2)) 
#'user/add2 
user> (add2 2) 
4 
user> (add2 "s") 
ClassCastException java.lang.String cannot be cast to java.lang.Number clojure.lang.Numbers.add (Numbers.java:128)                                       
user> 

(stest/instrument `adder)으로 spec'ing을 켜려고했습니다. 이 기능을 작동하는 동안 높은 순서 기능을 작동하지 않습니다.

+0

동일한 동작을 재현 할 수 있습니다. 마지막으로 "위에서 설명한대로"를 정확히 나타내는 부분은 어디입니까? 이중 백틱은 오타 또는 의도입니까? –

+0

@AntonHarald. 코드 블록을 업데이트했습니다. "위에서 설명한대로"는 게시물 상단의 굵게 표시된 ** 고차 함수 **를 나타냅니다. – frank

답변

2

clojure 1.9-alpha14 에서처럼 상위 함수는 그 방식으로 유효성을 검사 할 수 없습니다. clojure.spec.test/instrument을 보면 spec의 레지스트리에있는 함수를 찾고 있는데 fdef의 함수 만 포함합니다.

:ret의 fspec은 adder을 통해 clojure.spec.test/check을 테스트하고 그 값인 기능을 문서화하는 데 사용됩니다.