Here's my proposal:
* Basics:
Parrot uses nested hashes for namespaces (like perl does).
The high-level language splits namespace strings using whatever
its separator is ('::', '.' etc) to generate an array of strings
for the namespace lookup.
* Relative roots:
Namespace lookup starts from a 'root' namespace (think root directory).
Here the P2 argument holds the root namespace to start the lookup from:
find_global P1, P2, ['global', 'namespace', 'hierarchy'], "thingname"
If it's null then the interpreters default root namespace is used.
This scheme allows chroot() style shifting of the effective root.
(It's a key part of how the perl Safe module "works", for example.)
* Per-language root:
Each HLL could use a 'root' that's one level down from the true root.
Using a directory tree for illustration:
/perl/Carp/carp perl sees "Carp" at top level
/java/java/lang/... java sees "java" at top level
* Backlinks:
/perl/main -. "main" points back to "perls own root"
^------' (so "$main::main::main::foo" works as it should)
/perl/parrot -. "parrot" points back to true root
^-------------'
* Accessing namespace of other languages:
Given the above, accessing the namespace of other languages is as simple as:
/perl/parrot/java/java/lang/String/...
eg "$parrot::java::java::lang::String::CASE_INSENSITIVE_ORDER" for perl
and "parrot.perl.Carp.carp" for Java (perhaps, I don't claim to know any Java)
* Summary:
- Nested hashes allow chroot() style shifting of the root.
- That requires the 'effective root' to be passed to find_global.
- Each HLL could have it's own 'root' to avoid name clashes.
- Backlinks can be used to provide access to other HLL namespaces.
- This combination of unification (all in one tree) and isolation
(each HLL has a separate root) offers the best of all worlds.
Tim.