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