2017-05-09 64 views
2

任何人都可以解釋,下面的例子有什麼問題嗎? 它爲什麼會拋出StackOverflowError異常?clojure.spec符合拋出堆棧溢出異常

(s/def ::tag keyword?) 
(s/def ::s string?) 
(s/def ::n number?) 
(s/def ::g 
    (s/cat :tag (s/? ::tag) 
     :ex (s/alt :string ::s 
        :number ::n 
        :and (s/+ ::g) 
        ))) 


(s/conform ::g '["abc"]) 

回答

4

類似於亞歷克斯·米勒在this Google Groups discussion指出,s/+試圖定義期間解決::g

這應該做你想要什麼,我想:

(s/def ::g 
     (s/spec (s/cat :tag (s/? ::tag) 
         :ex (s/alt :string ::s 
           :number ::n 
           :and ::g)))) 

; REPL 
user=> (s/conform ::g [:foo [:bar "abc"]]) 
{:ex [:and {:ex [:string "abc"] :tag :bar}] :tag :foo}