On Mar 14, 7:54 pm, stu <stuart.hungerf...@gmail.com> wrote:
> Hi,
>
> I'd like to create a simple library of drawable shapes: lines, circles
> and rectangles.  I've placed each type of shape in its own namespace
> with functions that operate on that shape kind:
>
> (ns myshapes.line)
>
> (defn line ... creates new line ...)
>
> (defn draw ... draws a line ...)
>
> To keep things simple a line is just a vector of two points and
> circles and rectangles are just structs.
> I'd also like to have a sequence of shapes called a picture:
>
> (ns myshapes.picture)
>
> (defn picture ... returns picture sequence from args ...)
>
> (defn draw ... draws whole picture)
>
> What's the idiomatic way of handling a situation like this in
> Clojure?  Do I need to use richer data structures than vectors and
> structs for the shapes so they carry some kind of type information?  I
> can see how a draw multi-method would work if the individual shapes
> could be distinguished, or am I going about this the wrong way?

I think what you need is *less* rich data types, as I outline in my
answer (sorry, didn't notice this part of the question or I'd have
combined the two). Instead of special structs for each type, just have
every shape carry information in similar ways; then you can write a
draw-shape function that works with any old shape, not needing to know
much about them. If you want to be more explicit you can define all
shapes as a struct of {:points [p1 p2...], :whatever more-data, :and-
also even-more}, but it will help your dispatch immensely if there's a
single, coherent way to get a shape's points regardless of its types.

Then if you ever have to put special logic that depends on something
other than the points in the shape (eg circles have a radius), you can
turn that draw-shape function into a multimethod and have the :default
dispatch value do all the "boring" drawing.

-- 
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

Reply via email to