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.