Author: lwall
Date: 2009-02-12 18:04:41 +0100 (Thu, 12 Feb 2009)
New Revision: 25306

Modified:
   docs/Perl6/Spec/S10-packages.pod
   docs/Perl6/Spec/S11-modules.pod
   docs/Perl6/Spec/S12-objects.pod
Log:
[S10] updates to package policies


Modified: docs/Perl6/Spec/S10-packages.pod
===================================================================
--- docs/Perl6/Spec/S10-packages.pod    2009-02-12 16:03:41 UTC (rev 25305)
+++ docs/Perl6/Spec/S10-packages.pod    2009-02-12 17:04:41 UTC (rev 25306)
@@ -12,9 +12,9 @@
 
   Maintainer: Larry Wall <la...@wall.org>
   Date: 27 Oct 2004
-  Last Modified: 24 Apr 2007
+  Last Modified: 12 Feb 2009
   Number: 10
-  Version: 7
+  Version: 8
 
 =head1 Overview
 
@@ -24,11 +24,12 @@
 =head1 Packages
 
 As in Perl 5, packages are the basis of modules and classes.  Unlike in
-Perl 5, modules and classes are declared with separate keywords,
-but they're still just packages with extra behaviors.
+Perl 5, modules and classes are declared with distinct keywords,
+but they're still just packages with extra behaviors.  Likewise every
+typename has an associated package namespace, even if unused.
 
-An ordinary package is declared with the C<package> keyword.  It can
-only be used with a block:
+An ordinary package is declared with the C<package> keyword.  Unlike in
+Perl 5, in Perl 6 it can only be used with a block:
 
     package Bar {...}   # block is in package Bar
 
@@ -42,29 +43,27 @@
     package Foo;        # the entire file is Perl 5
     ...
 
-This form is illegal in the middle of a Perl 6 file.
+This form is illegal in a Perl 6 file.  If you wish to have a file-scoped 
package,
+either use the brace form or declare it with the C<module> keyword instead.
 
 Since there are no barewords in Perl 6, package names must be predeclared,
-or use the sigil-like C<::PackageName> syntax.  The C<::> prefix does not
-imply top-levelness as it does in Perl 5.  (Use C<::*> for that.)
+or use the sigil-like C<::PackageName> syntax to indicate that the type will
+be supplied some other way.  The C<::> prefix does not imply globalness as
+it does in Perl 5.  (Use C<GLOBAL::> for that.)
 
-A bare C<package> declarator declares an C<our> package within the
-current package (or module, or class, or role, or...).  Use C<*>
-or C<GLOBAL::> to declare a global package name.
+A bare C<package> declarator (without an explicit scope declarator
+such as C<my>) declares an C<our> package within the current package
+(or module, or class, or role, or...).  Use C<GLOBAL::> to declare
+a global package name.
 
 To declare a lexically scoped package, use C<my package>.
-Package names are always searched for from innermost scopes to outermost.
-As with an initial C<::>, the presence of a C<::> within the name
-does not imply globalness (unlike in Perl 5).  True globals are always
-in the C<GLOBAL::> namespace, which has the shortcut C<*> where that
-is not ambiguous with "real" operators.
 
-The C<*> namespace is not "main".  The default namespace for the main
-program is C<*Main> in Perl 6.  All files start out being parsed in the C<*>
-package, but switch to some other package scope depending on the first
-declaration.  If that first declaration is not a package variant, then
-the parsing switches to the "C<*main>" package for Perl 5 code and the
-"C<*Main>" package for Perl 6 code.
+All files start out being parsed in the C<GLOBAL>
+package, but may switch to some other package scope depending on the first
+package-ish declaration.  If that first declaration is not a package variant, 
then
+the parsing switches to the "C<main>" package for Perl 5 code.  Perl 6 code
+stays C<GLOBAL> in that situation.  The mainline code is thus in the
+C<GLOBAL> namespace unless declared otherwise.
 
 Package traits are set using C<is>:
 
@@ -81,6 +80,32 @@
 syntax that lets you do a lookup in a particular symbol table.  In this case,
 the key is not parsed for C<::>.  It's just a hash lookup.
 
+=head1 Package nesting
+
+A declaration of any object of the form C<A::B::c> also creates (if needed)
+an empty package C<A>, and an empty package C<B> inside of C<A>, in addition 
to creating
+C<c> inside of C<B>.  Such empty packages may be subsequently be redeclared as 
any other
+package-like object (module, class, etc.), and no redeclaration warning will 
be issued
+for such a redeclaration.  If a parent package already exists, no stub package
+needs to be created, and no declaration of the form C<A::B::c> has anything
+to say about the type of package C<A> or package C<A::B>, since any package 
variant
+can function as a package for the purposes of naming things.
+
+Apart of package declaration constructs, package names are always searched
+for from the innermost lexical scope to outermost.  If not defined in any
+surrounding lexical scope, the package is searched for from the current
+package up through the containing packages to C<GLOBAL>.  If it is not found,
+a compiler error results.
+
+As with an initial C<::>, the presence of a C<::> within the name
+does not imply globalness (unlike in Perl 5).  True globals are always
+in the C<GLOBAL::> namespace.
+
+The C<PROCESS::> namespace, shared by all interpreters within the process,
+is notionally outside of C<GLOBAL::>, but package searches do not look
+there for anything.  (Contextual variable searches do; C<$*PID> will eventually
+locate C<$PROCESS::PID> if not hidden by an inner context's C<$PID>.)
+
 =head1 Autoloading
 
 A package (or any other similar namespace) can control autoloading.

Modified: docs/Perl6/Spec/S11-modules.pod
===================================================================
--- docs/Perl6/Spec/S11-modules.pod     2009-02-12 16:03:41 UTC (rev 25305)
+++ docs/Perl6/Spec/S11-modules.pod     2009-02-12 17:04:41 UTC (rev 25306)
@@ -42,7 +42,7 @@
 
 Since there are no barewords in Perl 6, module names must be predeclared,
 or use the sigil-like C<::ModuleName> syntax.  The C<::> prefix does not
-imply top-levelness as it does in Perl 5.  (Use C<::*> or C<GLOBAL::> for 
that.)
+imply globalness as it does in Perl 5.  (Use C<GLOBAL::> for that.)
 
 A bare (unscoped) C<module> declarator declares a nested C<our> module
 name within the current package.  However, at the start of the file,

Modified: docs/Perl6/Spec/S12-objects.pod
===================================================================
--- docs/Perl6/Spec/S12-objects.pod     2009-02-12 16:03:41 UTC (rev 25305)
+++ docs/Perl6/Spec/S12-objects.pod     2009-02-12 17:04:41 UTC (rev 25306)
@@ -81,8 +81,8 @@
 
 Without a C<my> or other scoping declarator, a bare C<class>
 declarator declares an C<our> declarator, that is, a name within
-the current package.  Since class files begin parsing in the C<*>
-(C<GLOBAL>) package, the first class declaration in the file installs
+the current package.  Since class files begin parsing in the
+C<GLOBAL> package, the first class declaration in the file installs
 itself as a global name, and subsequent declarations then install
 themselves into the current class rather than the global package.
 

Reply via email to