Thanks, Alex. I've taken random example from plumatic.schema wiki to 
quickly illustrate the question. In my actual use case I dynamically 
generate schemas based on hundreds of model Java classes (beans) with 
mutual references so I need recursion (and also some way to model 
inheritance, that was is achieved with "conditional" in plumatic). Will try 
to implement the same with spec.


Am Montag, 23. Mai 2016 21:41:01 UTC+2 schrieb Alex Miller:
>
> 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