2016-10-27 3 views
0

In Clojure 1.9.0-alpha13, ich kann ein spec-Prädikat mit spec/and und , aber nicht and und number? definieren, erscheint es. Das ist rätselhaft. Es ist auch verwirrend, dass es keinen Fehler gibt, wenn ich das Prädikat definiere, sondern nur, wenn ich versuche, eine Spezifikation zu definieren, die es verwendet.nummer? kann nicht in der Spezifikation verwendet werden

Warum bekomme ich einen Fehler im zweiten Fall, aber nicht der erste? Ist dies ein Merkmal, das eine mir unbekannte Unterscheidung oder einen Fehler beinhaltet?

Beachten Sie, dass es kein Fehler ist, wenn es ::bar direkt definieren:

user=> (s/def ::bar (s/and number? pos?)) 
:user/bar 

Antwort

2

Ihr Code hier ist falsch. s/def sollte mit einem qualifizierten Schlüsselwort aufgerufen werden, um eine Spezifikation und kein Symbol zu registrieren.

So folgt aus:

user=> (s/def pos-int? (s/and integer? pos?)) 
user/pos-int? 

ist nicht zu tun, was Sie denken, es ist. Es registriert tatsächlich eine Funktionsdefinition (die Sie normalerweise über s/fdef) unter dem Symbol user/pos-int?.

user=> (s/def ::foo pos-int?) 
:user/foo 

Das funktioniert, weil pos-int? eine bestehende Funktion in clojure.core ist (das heißt, es ist überhaupt nicht Ihre vorherige Definition verwendet wird).

Dies scheint auch zu funktionieren, aber in ähnlicher Weise falsch:

user=> (s/def pos-num? (s/and number? pos?)) 
user/pos-num? 

Dies schlägt fehl:

user=> (s/def ::bar pos-num?) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: pos-num? ... 

weil pos-num nicht ein vorhandenes Prädikat ist.

Vorausgesetzt, Sie zwei Spezifikationen für positive ganze Zahlen registrieren möchten, und Zahlen, die Sie tun können:

(s/def ::pos-int (s/and integer? pos?)) 
(s/def ::pos-num (s/and number? pos?)) 
+0

Ah, vielen Dank für die Klärung meiner vielschichtigen Verwirrung. – Mars

1

Ich glaube, von Ihnen eine Interaktion mit dem vordefinierten von clojure.corepos-int? entdeckt. Im Quellcode:

src/CLJ/clojure/core.clj Linie 1400

(defn pos-int? 
    "Return true if x is a positive fixed precision integer" 
    {:added "1.9"} 
    [x] (and (int? x) 
      (pos? x))) 

Es gibt keine pos-num? vorhanden.

+0

Auch dann können Sie diese Frage an die Clojure Google-Gruppe E-Mail-Liste, um Posten mehr durch Erklärung zu erhalten. –

Verwandte Themen