If the set of types is closed and will not be extended by users, there's
nothing wrong with just writing your own dispatch using cond, something
like:
(defn draw [shape]
(cond
(triangle? shape) (draw-triangle shape)
(circle? shape) (draw-circle shape)
...))
Then just write your helper functions: triangle?, draw-triangle, circle?,
draw-circle and you're good to go. Clearly, no matter what, you need *some*
way to distinguish between your different types. It doesn't necessarily
have to be a true "type slot", as provided by defrecord. It could be that
you represent circles, for example, as a map that begins {:shape :circle
...}.
But it's true that protocols or multimethods would be the more common way to
do this. Protocols are reportedly faster, but not as flexible (e.g., *must*
dispatch on type, such as that provided by defrecord, no inheritance,
etc.). I still tend to go with multimethods. Multimethods (or rolling your
own predicates and dispatch as I described above) would allow you to use the
combination of vectors and structs you outlined.
--
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