I took a swing at this using prismatic schema: (ns schema-test.core (:require [schema.core :as s] [schema.utils :as utils] [schema.coerce :as coerce]) (:import schema.core.NamedSchema))
(def Alternate (s/named [s/Keyword] "alternate")) (def Path (s/named [(s/either s/Keyword Alternate)] "path")) (def T [(s/either s/Keyword Path)]) (def example [ :a [:a :b :c] [:a [:b1 :b2] :c ] ] ) (defn annotater [schema] (s/start-walker (fn [s] (let [walk (s/walker s)] (fn [x] (if (and (instance? clojure.lang.IObj x) (instance? schema.core.NamedSchema s)) (with-meta (walk x) {:schema (.name s)}) (walk x))))) schema)) (defn annotate [schema data] ((annotater schema) data)) (def r (annotate T example)) (map meta r) ; => (nil {:schema "path"} {:schema "path"}) (meta (nth (nth r 2) 1)) ; => {:schema "alternate"} On Thu, Jun 25, 2015 at 12:35 PM, Brian Marick <mar...@exampler.com> wrote: > Suppose we have a structure like this: > > [ :a [:a :b :c] [:a [:b1 :b2] :c ] ] > > That is a *required* list. It consists of keywords and *paths* (nested > vector like [:a :b :c] above). A path consists of keywords and *alternates* > (a twice-nested vector like [:b1 :b2]) above. > > It's easy to descend this by hand and keep track of which "type" of vector > you're dealing with. However, this sort of thing comes up enough that it > would be convenient if there were a function that takes a grammar and a > structure and returns that structure annotated (metadata?) with type > information. Coupled with Specter https://github.com/nathanmarz/specter, > that would make a good number of data transformations easy-peasy. > > Is there such a library? Or a library I can build on? A quick scan shows a > lot of parsers for dealing with strings, but we've already got one of > those: it's called `read`. > > @marick > > -- > 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. > -- 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.