Adam Kennedy wrote:

You get all those possibilities whenever you install any new version of a module you get from someone else, regardless of a p5->p6 hop. In p6, when you say "use Digest;", you are specifically asking for what p6 considers the "latest" version. In p5, it was "first match on libpath".


Except that within Perl 5, there is an general expectation that the same API will exist across multiple module versions. It is assumed that newer versions of a module will continue to work the same as older ones, with API breakages being a bad and rare thing.

The 6 month long mod_perl Apache::->Apache2:: argument was over this very thing. There is a huge difference between an API version and a module (implementation) version.

As far as I'm aware, there is no expectation that *every* module in Perl 6 that shares a name with a module in Perl 5 will merely be a re-implementation of the same API in Perl6.

If I am expected to reimplement all my Perl 5 modules in Perl 6 without the opportunity to do a better job and take advantage of new Perl 6 API-related features, could someone please point my boot in the general direction of the ass of whoever came up with that idea.

<soapbox>
Across all languages, libraries, modules, applications, operating systems, and most everything else in the computer world, I expect interoperability to remain mostly the same across minor version numbers, but anything goes when a new major version comes out. Now, I'm not terribly active in the CPAN arena, but I think it's short sighted to expect the API from version 1.1.5 to still be there in 2.7.1. This phenomenon is why it's fairly common to see the last minor version of the previous major version still around and available in many areas. Major changes in usage and syntax are what major version jumps are all about.
</soapbox>

As an alternative, the URI field of the module version could be extended to have the API version mixed somehow, maybe "cpan:JRANDOM#1.5.6". But that gets non-intuitive and ugly very quickly.

Part of the p5 problem is that module upgrades were all or nothing. In p6, you'll be able to load both the old version and the new version, at the same time. Or just tell the old apps that you don't have time to fix to use versions < 2.0.0, and the new apps to use version >= 2.0.0.

Another part of the problem with p5 is that while there was the ability to spec a version in a 'use' call, it was only a lower bound. You couldn't specify an upper bound as well, to tell people that you weren't ready for a new API/semantics. (To my knowledge, _nobody_ overrides the VERSION method)


Personally, I would prefer having to track which major version number I'm using over the mess that's in CPAN, where it seems like the standard way to introduce a new API is to come up with a new name for the module that means the same thing. However, as I pointed out before, since in p5 there is no notion of an author URI, haveing that become the string 'perl5' makes sense, and could be matched against, both positively and negatively.

-- Rod Adams

Reply via email to