2016-10-27 25 views
0

Clojure 1.9.0-alpha13では、spec/andinteger?を使用しているが、andnumber?ではないスペック述語を定義できます。これは困惑しています。私は述語を定義するときにエラーはないが、それを使って仕様を定義しようとするときだけ、困惑している。番号?

user=> (use '[clojure.spec :as s]) 
... 
nil 
user=> (s/def pos-int? (s/and integer? pos?)) 
user/pos-int? 
user=> (s/def ::foo pos-int?) 
:user/foo 
user=> (s/def pos-num? (s/and number? pos?)) 
user/pos-num? 
user=> (s/def ::bar pos-num?) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: pos-num? ... 

2番目のケースでエラーが発生しますが、最初のケースでエラーが発生するのはなぜですか。これは私が気付いていない、またはバグという区別を伴う機能ですか?

私が直接 ::barを定義した場合、エラーがないことを

注:

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

答えて

2

ここのコードは間違っています。 s/defは、シンボルではなくスペックを登録するためにqualified-keywordで呼び出す必要があります。

ので、この:

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

は、あなたがそれだと思う何をしていません。これは、実際には、というシンボルの下に関数定義(通常はs/fdefで行う)を登録しています。

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

pos-int?はclojure.core内の既存の機能(それはそれがすべてであなたの前の定義を使用していない、である)であるので、これは動作します。

また、これは動作しているように見えますが、同様に間違っています:

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

は、これは失敗します。

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

をPOS-numがない既存の述語であるため。

あなたはあなたができる正の整数と番号のための2つの仕様登録すると仮定:また

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

ああ、私の多面的な混乱を解決してくれてありがとう。 – Mars

1

私はあなたがclojure.coreから事前に定義されたpos-int?との相互作用を発見したと信じています。ソースコードでは:

のsrc/CLJ/Clojureの/ core.cljライン1400

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

pos-num?存在はありません。

+0

を、あなたは説明を通じてより多く得るためのClojure Googleグループの電子メールのリストにこの質問を投稿したい場合があります。 –