[ocaml-platform] Changes to my previous proposal for namespaces

Leo White lpw25 at cam.ac.uk
Tue Mar 19 10:38:00 GMT 2013


Alain Frisch <alain.frisch at lexifi.com> writes:

> Two more comments on Leo's proposal:
>
> 1. I think we should look for a different notation than Foo # Bar for namespace qualification.  "#" is already used for
> the method calls; it should be possible to implement this notation without creating conflicts in the grammar, but it
> might create confusion.  Consider the expression:
>
>   Foo#Bar.my_object # f Foo#Bar.e
>
> (I've been kind enough to avoid putting whitespaces around '#' when used for namespaces).

While I'm certainly not against a different notation, I would point out
that this example is no worse than:

    Foo.Bar.my_record . f Foo.Bar.e

which is currently a valid expression.

> I haven't really thought about a good alternative, but what about using ".." instead of "#" ?

To me Foo..Bar looks like some kind of range.

> 2. I think we should get rid of the aliasing feature in search path files ("Foo#Baz : Foo#Bar").  I expect that only
> advanced users will write search path files, and then can do the
> resolution themselves (or this could be automated).

This would prevent one package from providing aliases for modules in
another package. It is much safer to provide an alias to Core#Mutex than
to provide one to core-mutex.cmi and hope that Jane Street doesn't
change its file name.

> Aliases don't really simplify the life of end-users and they add complexity to the resolution mechanism (which might
> need to be re-implemented by build systems).

The complexity added is minuscule. 

As I have previously proposed, ocamldep (or some other tool) would
support the following use:

    ocamldep -lookup Foo#Baz foo.mlpath

This would lookup Foo#Baz within the search path file "foo.mlpath", if
it finds a mapping then it returns that mapping.

So the lookup logic is:

    name := Foo#Baz
    while there are more paths
        if !path is a directory then
            check for file named !name in !path
            if it found a file then
                return the filename
        else !path is a file
            run "ocamldep -lookup !name !path"
            if it found a mapping
                if mapping was a filename then
                    return the filename
                else mapping was an alias
                    name := !alias
            
So aliases add a single if condition.


More information about the Platform mailing list