You may want to look at what core.matrix does in this regard:

clojure.core.matrix: single namespace containing the public API
clojure.core.matrix.protocols: namespace containing all the protocols
clojure.core.matrix.impl.* : namespaces for specific implementations / 
subsystems
+ a few utility namespaces

The rationale for this is:

it's better for users if the public API is in a single namespace
the public API needs to require some of the implementations, so these need 
their own namespaces
the implementations need the protocols, so these have to be in a separate 
namespace

Note how this structure has been driven to some extent by the problem of 
circular dependencies.

On Monday, 15 April 2013 01:21:19 UTC+8, Simon Katz wrote:
>
> I'm in the process of trying to work out how I want to use namespaces when 
> implementing libraries or subsystems.
>
> I'm aware of several approaches:
>
>    - Use a single namespace, making only the API public (either with 
>    everything in a single file or breaking things into multiple files and 
>    using `load`).
>    - Use implementation namespaces and create an API in a separate 
>    namespace (perhaps using Potemkin to simplify the creation of the API).
>    - Have lots of smaller namespaces and have the client need to know 
>    which of the smaller namespaces to use for what.
>    - (And some variations.)
>    
>
> I'm fairly happy with large namespaces, so I'm leaning towards using a 
> single namespace.
>
> There's one thing I've come across that doesn't fit nicely with putting 
> everything into a single namespace, though.  A Google search for "Clojure 
> in the Large" led me to a nice talk by Stuart Sierra (
> http://vimeo.com/46163090) in which he suggests putting protocols and 
> their implementations in separate namespaces, because, during development 
> reloading a protocol breaks existing instances.  (I know Stuart gave a 
> similarly presentation at Clojure West recently, but I don't think the 
> video of that is available yet.)
>
> Having the separate namespaces would be fine if I was heading down the 
> route of having the client know about multiple namespaces, but I don't 
> really want to do that.  With the single namespace approach (with an extra 
> one for each protocol I define), I end up wanting circular dependencies — a 
> namespace containing a protocol implementation needs to refer to the main 
> namespace in order to mention the protocol, and the main namespace needs to 
> refer to the namespaces containing protocol implementations in order to 
> invoke constructors.
>
> Maybe I'll just put everything in a single namespace and be careful about 
> reloading the whole thing when I care about existing instances of protocols.
>
> Any other suggestions?
>
> Simon
>

-- 
-- 
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/groups/opt_out.


Reply via email to