On 1/7/08, Trey Harris wrote:
In a message dated Mon, 7 Jan 2008, Richard Hainsworth writes:
May I suggest the following extension to the 'use ' pragma, viz.
use <module name written in unicode and case sensitive> in
<filename as constrained by local system>
Oh please, no.
The entire point of the wording currently in the synopsis is so that
we can have platform-independent location of libraries. The "name
mangling capability" hypothesized lets the same C<use> get the
requested resource, regardless of the file (or database location!)
where the resource is actually located on the platform running Perl.
Yes, and having a proper library-manager to take care of all those
details will be a big improvement (e.g. Perl/Parrot can cache
pre-compiled versions because the library will know when things
change and need updating). But that comes at a cost: you can't
simply use some file you have lying about, you have to "load" it into
the library somehow first. So I'll run something like "plib load
--lang=perl some/file/path.pm", which takes care of specifying the
<filename as constrained by local system>. (Parrot will figure out
the module name by looking in the module itself.)
Still, we also want a way to use arbitrary files without the overhead
of going through the official library; something similar to the way
Perl 5 searches the current dir (if a requested module isn't in the
"library", which for P5 is just a list of dirs in @INC -- well, "."
is just the last element of @INC by default, so I guess it's part of
the "library" too). So we do need a way to say "look in the current
dir" or "look in this place" for bare files. And presumably you can
still say "use lib 'path'" in P6; but then we will need a way to
specify how to translate the module name into a filename.
That still doesn't mean that you need to be able to specify the
translation -- it could be predetermined, based on the OS/filesystem
you're using (e.g. if you're running Windows, the rule might be files
have to end in ".pm"; if you're using HFS+ on a Mac, it will look for
a case-insensitive filename; for ISO-9660, Unicode chars might have
to be %-encoded, etc.). (That assumes we can always tell what FS
we're using.)
However, that also means that the filename (however encoded) has to
match the module name. That's often fine, but sometimes
inconvenient. (E.g. the default translation policy might specify
that the local filepath would have to be 7 subdirs deep.) It'd be
much nicer to be able to say something like: use
Some::Fancy::Module::Name::Supercalifragilisticexpialidocious in
"./Supe.new".
I'm not worried about platform-independence because this is something
that typically applies when you're developing a module; once you're
ready to deploy or distribute it, you'd probably make a package that
officially "librarified" anything that needed to be. Portability,
independence, etc. are very important, but I don't think they should
be mandatory unless you can get them for free, and library-management
cannot be completely transparent, so there should be ways around it.
The .tar, etc., are typically named for transport, where you may
need to know the filetype without having the benefit of its contents
for examination. *.pdf and *.doc are filetypes that did not exist
until after Windows did, and so the required-extension behavior
ossified. The .* convention merely came about because it was a
convenient kludge put into ls for the purpose.
To be fair, they're all "convenient kludges" -- the problem isn't
Windows per se, the problem is filesystems that don't have a real
place for type metadata, which includes Unix as much as DOS, er,
Windows. Knowing the type of a file is valuable for lots of reasons;
it's just that in pre-GUI days, the primitive command-line interface
obscured some of the primitiveness of the FS.
So if I choose to call my perl6 scripts *.p6 it should not matter?
Other than for the sake of tradition or conformity with the tribe's
sense of propriety :)
Sure, knock yourself out. Call it ".perl6" if you like, or
".niftynewlanguagethatisn'tquitecompatiblewith.pl" (except those
violate eight.3 rules).
If one extension is bad, then surely a dozen are worse? So although
technically it's not necessary (personally, I hate filename
extensions), lots of people will be using them anyway -- we may as
well come up with a suggested community preference rather than
everyone coming up with something different.
And that configuration file would be a huge comb of $?OS and $?OSVER
switches in a typical platform-independent development. And even
so, the whole thing would be far more brittle than the
automatic-location system we have today, as problematic as it is
(not very, actually...).
Yup. Although I can't resist pointing out the that system we have
today uses extensions. Well, you could argue that the required ".pm"
is a "suffix" rather than an "extension" (in the Windows sense). I
think a primary raison d'etre is so you can have a module "Foo" which
is really Foo.pm and a directory "Foo" for sub-modules. But not
being allowed to have a file and a dir of the same name is itself
merely an unnecessary restriction that just happens to be implemented
by some currently-popular filesystems.
-David