<p dir="ltr">Can the case of both Core and Async (and opening both of their pervasives modules) be handled here?  This seems to me to be of fundamental importance.  If that's missing, then I misunderstood the proposal.</p>

<div class="gmail_quote">On Mar 18, 2013 7:38 AM, "Leo White" <<a href="mailto:lpw25@cam.ac.uk">lpw25@cam.ac.uk</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
> The problem with this fixed-syntactic choice is that it hampers<br>
> composability of namespaces.<br>
<br>
This is by design. This feature is only meant to provide support to<br>
specialised libraries, like Core, that wish to provide their own<br>
equivalent of the standard library's Pervasives module. We probably<br>
don't want to encourage its general use. I don't think it will be a<br>
problem that you can't easily compose the "Core" namespace with the<br>
standard library's namespace.<br>
<br>
> Assume you want to work with namespaces Foo and Bar at the same time.<br>
> In a hierarchical setting you can build a namespace with two<br>
> namespaces for Foo and Bar (eg. { A => Foo, B => Bar } ) and this has<br>
> very simple properties (no conflict/shadowing involved). In a flat<br>
> setting, or if you want to avoid adding one level of depth, you will<br>
> rather use (A merge B). What happens then if both A and B have a<br>
> Pervasives module?<br>
<br>
This would be handled like two compilation units with the same name: one<br>
would shadow the other and so only one would be opened. This is safer<br>
than having both modules opened, since opening both may result in one<br>
module partially shadowing another, which is more likely to go<br>
unnoticed.<br>
<br>
> Regarding the proposal as a whole:<br>
> - I'm curious and not sure: what is the reason to remove hierarchical<br>
> namespaces from your proposal? At first I believed it was the ongoing<br>
> tooling discussion with Alain, but he actually objects to<br>
> non-canonicity of names (as permitted by aliasing) more than your<br>
> foo-bar-baz hierarchical structure. Which perceived problems are<br>
> solved by this change?<br>
<br>
Despite Alain's concerns, I think that it will not be too difficult to<br>
handle the tooling for hierarchical namespaces. However, I think it will<br>
be easier to determine this once the tools have already been updated to<br>
support flat namespaces.<br>
<br>
Similarly, the design choice of shallow merging vs. deep merging for<br>
opening hierarchical namespaces may be easier to reason about once<br>
namespaces have been included in the language.<br>
<br>
These two issues are important, and require some thought before making a<br>
full proposal including hierarchical namespaces. Rather than waiting for<br>
these issues to be resolved, I would rather proceed, in the short term,<br>
with a proposal for flat namespaces.<br>
<br>
> - I believe the proposal is still inadequate, or at least<br>
> underspecified, with regard to the internal name conflicts problem.<br>
> What kind of conventions do you envision around your proposal to avoid<br>
> such conflicts?<br>
<br>
In my proposal modules must still have a unique name. This name will be<br>
reflected in the filename of the ".cmi" file (e.g. Foo#Bar as<br>
foo-bar.cmi). To avoid long source file names, the name can be specified<br>
with the "-name" command line argument.<br>
<br>
Since I expect people to provide a namespace for their package, I would<br>
expect the interface for module bar from package foo to be called<br>
"foo-bar.cmi". If people don't use the same names for their packages<br>
then this should avoid all naming conflicts.<br>
<br>
An alternative mechanism, also supported by my proposal and useful for<br>
libraries that are compatible with versions of OCaml without namespaces,<br>
is to name the module bar in the package foo "foo_bar.cmi" and then<br>
provide a search path file "foo.mlpath" that maps "Foo#Bar" to<br>
"foo_bar.cmi".<br>
<br>
Note that in both these solutions the source file can be named "<a href="http://bar.ml" target="_blank">bar.ml</a>",<br>
and the "-name" argument used to add the "Foo#" or "Foo_" prefix to the<br>
name. Build systems could easily add automatic support for these<br>
conventions.<br>
<br>
If people wish to be extra careful then they can use the "-name"<br>
argument to add whatever additional data they want to the module name to<br>
ensure that it is unique.<br>
_______________________________________________<br>
Platform mailing list<br>
<a href="mailto:Platform@lists.ocaml.org">Platform@lists.ocaml.org</a><br>
<a href="http://lists.ocaml.org/listinfo/platform" target="_blank">http://lists.ocaml.org/listinfo/platform</a><br>
</blockquote></div>