I am writing some software that is essentially an interpreter for
structures called plans, which are either:
- steps, maps that have a specific way of handling them based on their
:type. Examples include e.g. make a http request, which would look like
{:type :http :url "http://whatever" :method :put}.
- sets of plans (recursive)
- vectors of plans (recursive)
So, eventually, it's steps at the "leaves", and then there's a recursive
tree-like structure organizing them (except that some branches are ordered,
and some are unordered).
For example:
[#{{:type :x :temperature 30}
{:type :y :color "#dfcdfc"}}
{:type :log :message "Success!"}]
... which means "do :x with temperature 30 and :y with color #dfcdfc
concurrently. When you're done with both, log a success message.". It's a
little trickier than that (failure etc), but that's the gist of it.
Right now, I'm doing this with a multimethod. Dispatching happens based on
if it's a set, vector or a step:
(fn [x] (cond (set? x) ::unordered-plans
(vector? x) ::ordered-plans
:else (:type x)))
That works, but implementations are in different namespaces, so I find
myself requiring namespaces for the side-effect. It works, but it's not
great. I guess maybe I'm abusing multimethods. Additional considerations:
- I would like to not have to manage a manual list of things I'm
:require-ing, but instead just automagically :require all the stuff in
myproject.handlers.* namespaces.
- I would like people to be able to write their own implementations; so I
guess I need to be able to namespaces as configuration as well.
- I *think* I want these handlers to be configurable so that people can
choose to drop support for some of them, in which case "works if it has
been :require'd" sounds like it maybe isn't the best API.
Any guidance is appreciated. Maybe I should make it register all
*available* handlers in an atom-wrapped map internally, or something.
thanks in advance,
lvh
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.