Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Namespaces and type prefixes

1 view
Skip to first unread message

Dan Sugalski

unread,
Sep 23, 2003, 10:31:30 AM9/23/03
to perl6-i...@perl.org
Okay, it's time to deal with a particularly unpleasant
topic--cross-language namespace management.

This is *only* for those cases where we need to look things up by name in
some namespace (either global or lexical), and doesn't affect what we do
with the PMC we get back once we've done that.

Basically, the problem is this: Perl, along with a number of other
languages, allows multiple things with the same name, as long as they're
different types. (You can have an array and a sub with the same name, for
example) Generally languages split at least the sub/function namespace out
from the variable namespace, though some languages (notably perl) also
split the variable namespace by broad type.

Now, this wouldn't be a problem--we could segregate the namespaces,
except... Introspecting facilities in those languages assume that there is
a single unified namespace, rather than a type-split namespace, and
there's some disagreement as to how many namespace types there should be.

Perl gets around this by either two-levelling the names (so that there's a
single entry for 'foo', and that PMC-equivalent is an array that has a
slot for scalar, hash, array, sub, and so forth), and while we can do
that, well... yech. (And I mean that sincerely) The proposal for *user*
views (i.e. we can screw with what they ask for before we look) in perl 6
is to have separate entries in the namespace with an appropriate perl
prefix, so if there's a $foo in your program, there's a "$foo" name in the
name table.

That, as you might expect, has just a *few* cross-language issues. Many
other languages don't draw the subtype distinction that perl does--you're
allowed one variable 'foo' and that's it, regardless of its type.

Personally I'm currently of the opinion that we should split the
namespace into functions/methods/subs and variables, either by convention
with a prefix character or with an explicit parameter, and let the
variables fend for themselves. Whatever language prefix (if any) gets
used, and if people go dancing through someone else's namespace they may
find things they didn't expect, well.. "Here there be dragons.
Marshmallows, anyone?" A leading NULL byte for subs seems quite nice if we
keep them in the same table as variables, or we can split the table in
two.

I'm currently pondering the namespace separator character as well. Perl
uses :: between levels, and I've no idea off-hand what other languages
use. Personally I'm tempted to use a null between levels and put in a
translator layer in generated bytecode for symbolic access from HLLs.

Dan

0 new messages