[ocaml-platform] on the need and design of OCaml namespaces

Leo White lpw25 at cam.ac.uk
Thu Feb 21 15:36:26 GMT 2013


> Since about a year now, there has been a intermittent discussion ongoing 
> on the idea of introducing "namespaces" to the OCaml language[...], but 
> there have been fairly different ideas about how to best solve those 
> problems, or even what "namespace" means.

As I see it what we *need* from namespaces is fairly simple:

  Developers must be able to give their components long (hierarchical) 
  names without changing the component's filename.

This allows components with the same filename to coexist within the search 
path. It also allows these components to be grouped together without 
packing them into a single module.

Any other features, such as allowing users to use multiple versions of a 
component or automatically assigning long names to components based on 
their position within the filesystem should be considered superfluous and 
unnecessary for an initial implementation.


In practical terms, what we need (based on Fabrice's "namespaces" branch of 
the OCaml source tree) is to be able to start a file with a syntax like:

  in Core.Std

This path is then included in the .cmi file and other compiled files. Then, 
when a user writes "Core.Std.List", lookup proceeds as follows:

1. Look for a module called Core in the current local environment. 

2. Look for a file "core.cmi" in the search path that is not attached to a 
   namespace.

3. Look for a file "std.cmi" in the search path that is attached to the 
   "Core" namespace.

4. Look for a file "list.cmi" in the search path that is attached to the 
   "Core.Std" namespace.

This lookup scheme could be simplified by, as Gabriel has suggested, using 
a different separator for namespaces (e.g. Core#Std#List). Personally, I 
don't have a strong opinion either way. A new separator is less ambiguous, 
but it is one more piece of syntax for beginners to learn.


Other simple features that would be useful include:

- Opening namespaces  ("open Core.Std")

- Aliasing namespaces  ("open Core.Std as CS")

- Attaching a component to multiple namespaces ("in Core.Std and 
  Core.Containers")

- A command-line option alternative to the "in" syntax.

- A command-line option to pre-open namespaces.

Regards,

Leo



More information about the Platform mailing list