2016-09-08 5 views
4

Ich versuche, eine höhere Ordnung Funktion in clojure.spec mit der Version 1.9.0-alpha11 zu schreiben und war nicht in der Lage, die Validierung gegen die zurückgegebene Funktion ausgeführt werden.clojure.spec Validierung für fdef

Unter Verwendung des Beispiels in den Funktionen höherer Ordnung Abschnitt der Führungs clojure.spec definiere ich eine adder Form als:

:

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

Wie in der Anleitung beschrieben, einen I spec wie erstellen

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

Als ich es in der repl auszuführen, wird eine Ausnahme anstelle des gewünschten spec Validierungsfehler ausgelöst:

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> 

Ich versuchte mit (stest/instrument `adder) spec_ing einzuschalten. Während dies für Funktionen funktioniert, funktioniert es nicht für Funktionen höherer Ordnung.

+0

Ich könnte das gleiche Verhalten reproduzieren. Wo genau bezieht sich dein letztes "wie oben beschrieben"? Und ist der doppelte Backtick ein Tippfehler oder beabsichtigt? –

+0

@AntonHarald. Ich habe den Codeblock aktualisiert. Das "wie oben beschrieben" bezieht sich auf die fettgedruckten ** Funktionen höherer Ordnung ** oben auf dem Post. – frank

Antwort

2

So wie es in clojure 1.9-alpha14 steht, können Funktionen höherer Ordnung nicht auf diese Weise validiert werden. Mit Blick auf clojure.spec.test/instrument sucht es nach Funktionen in der Registrierung von spec, die nur fdef Funktionen enthalten.

Die fspec im :ret verwendet wird, wenn über adderclojure.spec.test/check Tests und die Funktion neben dokumentieren, dass der Wert davon ist.