That schema looks weird to me as it seems to under-constrain leaf vs branch 
so this is not really equivalent but makes sense to me:

(spec/def ::tree (spec/or :leaf ::leaf :branch ::branch))
(spec/def ::leaf integer?)
(spec/def ::branch (spec/cat :left ::tree :right ::tree))
(spec/conform ::tree [[1 2] [3 4]])
=> [:branch {:left [:branch {:left [:leaf 1], :right [:leaf 2]}], :right 
[:branch {:left [:leaf 3], :right [:leaf 4]}]}]

Because you register specs in the registry by keyword that gives you the 
point of indirection to do recursive structures.

Generate some trees!

(gen/sample (spec/gen ::tree) 5)
=> (-1 -1 (0 0) (0 2) (-1 -1))

(gen/sample (spec/gen ::tree) 5)
=> (((-1 0) 0) 0 1 (0 1) (1 -3))


On Monday, May 23, 2016 at 11:16:44 AM UTC-5, Alex Miller wrote:
>
> Yes, you can create recursive definitions by registering a spec that 
> refers to itself via registered name (a namespaced keyword).
>
>
> On Monday, May 23, 2016 at 11:13:24 AM UTC-5, Andrey Grin wrote:
>>
>>  Is it planned to support recursive definitions? Example from.plumatic 
>> schema:
>>  
>>
>> (def BinaryTree 
>>   (maybe ;; any empty binary tree is represented by nil
>>    {:value long 
>>     :left (recursive #'BinaryTree) 
>>     :right (recursive #'BinaryTree)}))
>>
>>

-- 
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