[racket] "private" modules to make an opaque struct type

From: Ryan Culpepper (ryan at cs.utah.edu)
Date: Wed Feb 29 01:27:18 EST 2012

On 02/28/2012 10:22 PM, David T. Pierson wrote:
> Hi all,
>
> Many racket collections define some modules in a subdirectory named
> "private".  Presumably these modules are for definitions that are used
> by other modules in the same collection but are not meant to be used
> from outside the collection.  As far as I can tell, this is just a
> convention and is not enforced in any way.  Are there any guidelines for
> such "private" modules?  I couldn't find anything searching the
> documentation and the list archives.

As you say, it's a convention, but access control isn't enforced.

Guidelines: Avoid using other libraries' private modules. Don't 
encourage other libraries to use your private modules (eg, put things 
that need to be public in public modules). Try not to refer to private 
module names in interface documentation, error messages, etc.

> I'm considering such a private module to define a custom struct type.
> The struct's fields would be used by multiple modules in my collection,
> and instances of the struct would be used outside the collection, but I
> want the struct to be opaque to code outside my collection.  In other
> words I'd reexport only the type predicate procedure from the main
> module.  Is this a typical use of "private" modules?

Yes, it's common to have a public module that selectively exports 
bindings from one or more private modules. It's often a good idea to put 
contracts on the public module's exports, although for simple predicates 
it isn't that important.

Ryan

Posted on the users mailing list.