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.