I just ran in to a similar issue:

-----------------------------

(require '[clojure.spec :as s])

(s/def ::a (s/keys :req [::b]))

(s/fdef ::a-fn
  :args (s/cat :arg ::a)
  :ret ::a)

(s/def ::b (s/keys :req [::a-fn]))

;; All of these fail even with s/*recursion-limit* bound to 1.

(s/exercise ::a) ;; StackOverflowError   clojure.test.check.rose-tree/pure 
(rose_tree.cljc:-1)
(s/exercise ::b) ;; StackOverflowError   clojure.lang.Numbers$LongOps.isPos 
(Numbers.java:447)
(s/exercise ::a-fn) ;; StackOverflowError   clojure.lang.AFn.applyToHelper 
(AFn.java:148)

-----------------------------


On Friday, July 1, 2016 at 7:53:44 PM UTC+2, Maarten Truyens wrote:
>
> Hi, 
>
> I am struggling with recursive Spec declarations, more in particular how 
> two Spec definitions can refer to each other. In the example below, I use a 
> "forward" declaration, but that does not seem very elegant. Am I missing 
> something? 
>
> The more fundamental question, however, is how to implement recursion 
> limits. After several recursive iterations  during generation, I would like 
> to force the use of non-recursive elements (leafs in the example below), to 
> avoid stackoverflows. However, I am struggling to see how a recursion limit 
> can be implemented.
>
> Example code:
>
>
> ; "Forward" declarations of specs
>
> (s/def ::Tree ::s/any)
>
> (s/def ::Leaf ::s/any)
>
>
> (s/def ::name string?)
>
> (s/def ::children (s/coll-of (s/or :tree ::Tree, :leaf ::Leaf)))
>
>
> (defrecord Tree [name children])
>
> (defrecord Leaf [name])
>
>
> (s/def ::Leaf (s/with-gen
>
>                (s/keys :req-un [::name])
>
>                #(gen/let [name (s/gen ::name)]
>
>                          (->Leaf name))))
>
> (s/def ::Tree (s/with-gen
>
>                (s/keys :req-un [::name ::children])
>
>                #(gen/let [name (s/gen ::name)
>
>                           children (s/gen ::children)]
>
>                          (->Tree name children))))
>
>
> When trying to generate a Tree (gen/generate (s/gen ::Tree)), a 
> Stackoverflow is produced. 
>
> I am aware of a bug report (http://dev.clojure.org/jira/browse/CLJ-1964), 
> but that report was closed by Alex Miller due to the changes in Alpha8. 
> (BTW, the sample code in that bug report still produces a stackoverflow in 
> Alpha8, despite Alex' suggestion that it should now work). 
>
> Any ideas?
>
> Best regards, 
>
> Maarten
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to