Author: wayland
Date: 2009-02-24 06:17:29 +0100 (Tue, 24 Feb 2009)
New Revision: 25519

Modified:
   docs/Perl6/Spec/S28-special-variables.pod
Log:
Lots of general reoganisation.  Still needs lots more work, and I will continue 
when I get 
the chance (probably tomorrow).  Hope I haven't reintroduced any old artifacts 
again :).  



Modified: docs/Perl6/Spec/S28-special-variables.pod
===================================================================
--- docs/Perl6/Spec/S28-special-variables.pod   2009-02-24 05:13:28 UTC (rev 
25518)
+++ docs/Perl6/Spec/S28-special-variables.pod   2009-02-24 05:17:29 UTC (rev 
25519)
@@ -131,50 +131,6 @@
 
 =over 8
 
-=item $0,$1,$2...
-
-Objects containing information on any subpatterns 
-from the corresponding set of capturing 
-parentheses from the last pattern match, not counting patterns 
-matched in nested blocks that have been exited already.
-These variables are all read-only and dynamically scoped to the 
-current BLOCK. Shortcut to same info in $/ with data structures containing 
-such things as .start and .end (Unicode level independent).
-
-=over 4 
-
-=item p5:
-
-$1,$2,$3... but now as objects, and base zero instead of one.
-
-=back
-
-=back
-
-=over 8
-
-=item $0
-
-$0 (dollar-zero) is the string matched by the last successful 
-pattern match (not counting any matches hidden within a BLOCK 
-or eval() enclosed by the current BLOCK). 
-This variable is read-only and dynamically scoped to the current BLOCK.
-What would be returned by $1 if you had
-put parens around the entire match. $0 is not bound until 
-the match succeeds. 
-
-=over 4 
-
-=item p5:
-
-$&, $MATCH
-
-=back
-
-=back
-
-=over 8
-
 =item $*MOST_RECENT_CAPTURED_MATCH
 =item $/[-1]
 =item $/[-$n]
@@ -192,99 +148,6 @@
 
 =back
 
-=over 8
-
-=item $.
-
-=item $IN_FH.input_line_number  ...or some such
-
-May-be. Current line number for the filehandle. 
-Each filehandle in Perl counts the number of lines 
-that have been read from it. 
-(Depending on the value of $IN_FH.input_rec_separator, 
-Perl's idea of what constitutes a line may not match yours.) 
-When a line is read from a filehandle, 
-or when tell() or seek() is called on it, 
-$IN_FH.input_rec_separator becomes an alias to the 
-line counter for that filehandle.
-
-=over 4 
-
-=item p5:
-
-$.  $NR  $INPUT_LINE_NUMBER  HANDLE->input_line_number(EXPR)
-But now with cleaned-up localization usage.
-
-=back
-
-=back
-
-=over 8
-
-=item $IN_FH.input_rec_separator ...or some such
-
-The input record separator, newline by default. 
-This influences Perl's idea of what a ``line'' is. 
-Works like awk's RS variable, including treating empty lines 
-as a terminator if set to the null string. 
-(An empty line cannot contain any spaces or tabs.) 
-You may set it to a multi-character string to match a multi-character 
-terminator, or to undef to read through the end of file. 
-Setting it to "\n\n" means something slightly different 
-than setting to "", if the file contains consecutive empty lines. 
-Setting to "" will treat two or more consecutive empty lines 
-as a single empty line. Setting to "\n\n" will blindly assume 
-that the next input character belongs to the next paragraph, 
-even if it's a newline. 
-(Mnemonic: / delimits line boundaries when quoting poetry.)
-
-Remember: the value of $/ is a string, not a regex. 
-awk has to be better for something. :-)
-
-=over 4 
-
-=item p5:
-
-$/ $RS $INPUT_RECORD_SEPARATOR
-IO::Handle->input_record_separator(EXPR)
-
-=back
-
-=back
-
-=over 8
-
-=item $OUT_FH.autoflush  ...or some such
-
-If set to nonzero, forces a flush right away and after every write 
-or print on the currently selected output channel. 
-Default is 0 (regardless of whether the channel is really buffered 
-by the system or not; 
-$OUT_FH.autoflush tells you only whether you've asked Perl 
-explicitly to flush after each write). 
-$*OUT will typically be line buffered if output is to the 
-terminal and block buffered otherwise. 
-Setting this variable is useful primarily when you are 
-outputting to a pipe or socket, 
-such as when you are running a Perl program under rsh 
-and want to see the output as it's happening. 
-This has no effect on input buffering. 
-(Mnemonic: when you want your pipes to be piping hot.)
-
-=over 4 
-
-=item p5:
-
-$|  $OUTPUT_AUTOFLUSH  HANDLE->autoflush(EXPR)
-
-=back
-
-=back
-
-
-. . . More to come here . . .
-
-
 =head1 PERL 6 / PERL 5 COMPARISON
 
 =over 4
@@ -309,90 +172,56 @@
 
 =back
 
- Perl 5         Perl 6         Comment
- -----------    -----------    -----------------------
- STDIN          $*IN           See S16
+ Perl 5              Perl 6         Comment
+ -----------         -----------    -----------------------
+ STDIN               $*STDIN        See S16; you probably want $*IN
+ STDOUT              $*STDOUT       See S16; you probably want $*OUT
+ STDERR              $*STDERR       See S16;   you probably want $*ERR
+ $_                  $_             More lexically aware
+ $_[1],$_[2]..       $^a,$^b..  
+ $a,$b               -              Just params to anonymous block
+ -                   $/             Object with results of last regex match
+ $1,$2,$3...         $1,$2,$3...
+ $&, $MATCH          $<>
+ $`, $PREMATCH       $<pre>
+ $', $POSTMATCH      $<post>
+ $+                  -              But info can now be retrieved from $/
+ $^N                 $*MOST_RECENT_CAPTURED_MATCH  ...or some such. 
+                  or $/[-$n]                       ...or omit 
+ @-                  $1.start, etc
+ @+                  $1.end, etc.
+ $*                  -
+ $#                  -
+ $.                  $*IN.input_record_number()
+ $/                  $*IN.input_record_separator()
+ $|                  $*OUT.autoflush()
+ $,                  $*OUT.output_field_separator()
+ $\                  $*OUT.output_record_separator()
+ $$, $PID            $*PID
+ $<, $UID            $*UID          Real UID (User ID)
+ $(, $GID            $*GID          Real GID (Group ID)
+ $>, $EUID           $*EUID         Effective UID
+ $), $EGID           $*EGID         Effective GID
+ $0, $PROGRAM_NAME   $*PROGRAM_NAME
+ $^C, $COMPILING     $*COMPILING
+ $^D, $DEBUGGING     $*DEBUGGING
+ $^F, $SYS_FD_MAX    $*SYS_FD_MAX   ...or some such
+ $^I, $INPLACE_EDIT  $*INPLACE_EDIT ...or some such
+ $^M                 $*EMERGENCY_MEMORY ...or some such (or omit)
+ $^O, $OSNAME        $*OSNAME       ...or some such
+ $^P, $PERLDB        $*PERLDB       ...or some such
+ $^R                 $*LAST_REGEXP_CODE_RESULT   ...or some such. Or omit.
+ $^T, $BASETIME      $*BASETIME     A Temporal::Instant object
+ ${^WARNING_BITS}    $?WARNINGS
+ $^X                 $*EXECUTABLE_NAME ...or some such
+ $EXECUTABLE_NAME
 
- STDOUT         $*OUT          See S16
-
- STDERR         $*ERR          See S16
-
- $_             $_             More lexically aware
-
- $_[1],$_[2]..  $^a,$^b..  
-
- $a,$b            -            Just params to anonymous block
-
-   -            $/             Object with results of last regex match
-
- $1,$2,$3...    $1,$2,$3...
-
- $&             $<>
-
- $`             $<pre>
-
- $'             $<post>
-
- $+               -            But info can now be retrieved from $/
-
- $^N            $*MOST_RECENT_CAPTURED_MATCH  ...or some such. 
-             or $/[-1]                        ...or omit
-             or $/[-$n] 
-
- @+               $1.end, etc.
- 
- $*               -
-
- $.             $IN_FH.input_line_number  ...or some such
-
- $/             $IN_FH.input_rec_separator  ...or some such
-
  ******* XXX the columns seem to have switched! *********
 
- $OUT_FH.autoflush           ...or some such
-         $|  $OUTPUT_AUTOFLUSH
-             HANDLE->autoflush(EXPR)
-
- $OUT_FH.output_field_separator   ...or some such
-         $,  $OFS $OUTPUT_FIELD_SEPARATOR
-             IO::Handle->output_field_separator
-
- $OUT_FH.output_record_separator   ...or some such
-         $\  $ORS $OUTPUT_RECORD_SEPARATOR
-             IO::Handle->output_record_separator
-
  -       $"  $LIST_SEPARATOR
 
  -       $;  $SUBSEP $SUBSCRIPT_SEPARATOR
 
- -       $#             Output format for printed numbers.
-
- -       $%  $FORMAT_PAGE_NUMBER
- -           HANDLE->format_page_number(EXPR)
-
- -       $=  $FORMAT_LINES_PER_PAGE
- -           HANDLE->format_lines_per_page(EXPR)
-
- -       $-  $FORMAT_LINES_LEFT
- -           HANDLE->format_lines_left(EXPR)
-
- $1.start, etc.       @-  @LAST_MATCH_START
-
- -       $~  $FORMAT_NAME
- -           HANDLE->format_name(EXPR)
-
- -       $^  $FORMAT_TOP_NAME
- -           HANDLE->format_top_name(EXPR)
-
- -       $:  $FORMAT_LINE_BREAK_CHARACTERS
- -           IO::Handle->format_line_break_characters
-
- -       $^L $FORMAT_FORMFEED
- -           IO::Handle->format_formfeed
-
- -       $^A $ACCUMULATOR
-
-
  ?       ${^ENCODING}
 
  $!                     Universal error object with as much info as
@@ -407,20 +236,6 @@
 
  -       %!
 
- $*PID   $$  $PID $PROCESS_ID
-
- $*UID                  ...or some such
-         $<  $UID $REAL_USER_ID
- $*EUID                 ...or some such
-         $>  $EUID $EFFECTIVE_USER_ID
- $*GID                  ...or some such
-         $(  $GID $REAL_GROUP_ID
- $*EGID                 ...or some such
-         $)  $EGID $EFFECTIVE_GROUP_ID
-
- $*PROGRAM_NAME         ...or some such
-         $0  $PROGRAM_NAME
-
  -       $[             Index of the first element in an array, 
                         and of the first character in a substring.
 
@@ -429,38 +244,11 @@
  -       $]             version + patchlevel / 1000 of Perl interpreter
                         Replacement for the above two is unclear.
 
- $*COMPILING            ...or some such
-         $^C $COMPILING
-
- $*DEBUGGING            ...or some such
-         $^D $DEBUGGING
-
- $*SYS_FD_MAX           ...or some such
-         $^F $SYSTEM_FD_MAX
-
  -       $^H
  -       %^H
 
- $*INPLACE_EDIT         ...or some such
-         $^I $INPLACE_EDIT
-
- $*EMERGENCY_MEMORY     ...or some such (or omit)
-         $^M
-
- $*OSNAME               ...or some such
-         $^O $OSNAME
-
  -       ${^OPEN}
 
- $*PERLDB               ...or some such
-         $^P $PERLDB
-
- $*LAST_REGEXP_CODE_RESULT   ...or some such. Or omit.
-         $^R $LAST_REGEXP_CODE_RESULT
-
- $*BASETIME             ...or some such
-         $^T $BASETIME
-
  ?       ${^TAINT}
  ?       ${^UNICODE}
 
@@ -469,11 +257,6 @@
                         of) warnings within both lexical and 
                         dynamic scopes.
 
- $?WARNINGS       ${^WARNING_BITS}
-
- $*EXECUTABLE_NAME      ...or some such
-         $^X $EXECUTABLE_NAME
-
  ?       $ARGV
  
  $*ARGS  ARGV        Note the P6 idiom: 
@@ -669,3 +452,442 @@
 =cut
 
 
+=encoding utf8
+
+=head1 TITLE
+
+Synopsis 2: Bits and Pieces
+
+S02
+
+=head1 AUTHOR
+
+Larry Wall <la...@wall.org>
+
+=head1 VERSION
+
+  Maintainer: Larry Wall <la...@wall.org>
+  Date: 10 Aug 2004
+  Last Modified: 20 Feb 2009
+  Number: 2
+  Version: 153
+
+=item *
+
+Many of the special variables of PerlĀ 5 are going away.  Those that
+apply to some object such as a filehandle will instead be attributes
+of the appropriate object.  Those that are truly global will have
+global alphabetic names, such as C<$*PID> or C<@*ARGS>. 
+
+=item *
+
+Any remaining special variables will be lexically scoped.
+This includes C<$_> and C<@_>, as well as the new C<$/>, which
+is the return value of the last regex match.  C<$0>, C<$1>, C<$2>, etc.,
+are aliases into the C<$/> object.
+
+=item *
+
+The following pseudo-package names are reserved at the front of a name:
+
+    MY          # Symbols in the current lexical scope (aka $?SCOPE)
+    OUR         # Symbols in the current package (aka $?PACKAGE)
+
+=item *
+
+When "strict" is in effect (which is the default except for one-liners),
+non-qualified variables (such as C<$x> and C<@y>) are only looked up from
+lexical scopes, but never from package scopes.
+
+To bind package variables into a lexical scope, simply say C<our ($x, @y)>.
+To bind global variables into a lexical scope, predeclare them with C<use>:
+
+    use GLOBAL <$IN $OUT>;
+
+Or just refer to them as C<$*IN> and C<$*OUT>.
+
+=item *
+
+The C<CALLER> package refers to the lexical scope of the (dynamically
+scoped) caller.  The caller's lexical scope is allowed to hide any
+user-defined variable from you.  In fact, that's the default, and a
+lexical variable must have the trait "C<is context>" to be
+visible via C<CALLER>.  (C<$_>, C<$!> and C<$/> are always
+contextual.) If the variable is not visible in the caller, it returns
+failure.  Variables whose names are visible at the point of the call but that
+come from outside that lexical scope are controlled by the scope
+in which they were originally declared as contextual.
+Hence the visibility of C<< CALLER::<$*foo> >> is determined where
+C<$*foo> is actually declared, not by the caller's scope (unless that's where
+it happens to be declared).  Likewise C<< CALLER::CALLER::<$x> >>
+depends only on the declaration of C<$x> visible in your caller's caller.
+
+Any lexical declared with the C<is context> trait is by default
+considered readonly outside the current lexical scope.  You may
+add a trait argument of C<< <rw> >> to allow called routines to
+modify your value.  C<$_>, C<$!>, and C<$/> are C<< context<rw> >>
+by default.  In any event, the declaring scope can always access the
+variable as if it were an ordinary variable; the restriction on writing
+applies only to access via the C<*> twigil.
+
+=item *
+
+The C<CONTEXT> pseudo-package is just like C<CALLER> except that
+it starts in the current dynamic scope and from there
+scans outward through all dynamic scopes until it finds a
+contextual variable of that name in that context's lexical scope.
+(Use of C<$*FOO> is equivalent to C<< CONTEXT::<$FOO> >> or C<< $CONTEXT::FOO 
>>.)
+If after scanning all the lexical scopes of each dynamic scope,
+there is no variable of that name, it looks in the C<GLOBAL> package followed
+by the C<PROCESS> package.
+If there is no such package variable,
+it then looks in C<CONTEXT::<%ENV> for the identifier of the variable,
+which, if not overridden in a dynamic scope, finds C<< PROCESS::<%ENV> >>,
+that is, in the environment variables passed to program.  If the
+value is not found there, it returns failure.  If the variable is
+of the form C<$*FOO>, the complete environment value is returned.  If it
+is of the form C<@*FOO> the string will be split either on colons or
+semicolons as appropriate to the current operating system.  Usage of
+the C<%*FOO> form is currently undefined.
+
+Unlike C<CALLER>, C<CONTEXT> will see a contextual variable that is declared in
+the current scope, however it will not be writeable via C<CONTEXT> unless
+declared "C<< is context<rw> >>", even if the variable itself is
+modifiable in that scope.  (If it is, you should just use the bare
+variable itself to modify it.)  Note that C<$*_> will always see
+the C<$_> in the current scope, not the caller's scope.  You may
+use C<< CALLER::<$*foo> >> to bypass a contextual definition of C<$foo>
+in your current context, such as to initialize it with the outer
+contextual value:
+
+    my $foo is context = CALLER::<$*foo>;
+
+The C<temp> maybe used on a contextual variable to perform a similar operation:
+
+    temp $*foo;
+
+The main difference is that by default it initializes the new
+C<$*foo> with its previous value, rather than the caller's value.
+The temporized contextual variable takes its read/write policy from
+the previous C<$*foo> container.
+
+The C<CONTEXT> package is primarily for internal overriding of contextual
+information, modelled on how environmental variables work among
+processes.  Despite the fact that the C<CONTEXT> package reflects the
+current process's environment variables individually where those are not
+hidden by lower-level declarations, the actual set of environment variables
+that will be passed to subprocesses is taken from the C<%*ENV> variable.
+Hence you must override that variable itself to influence what is
+passed to subprocesses.  That is,
+
+    temp $*LANG = "ja_JP.utf8";   # WRONG
+    run "greet";
+
+does not set the LANG environment variable for the greet program.  Instead
+you should make a private copy of the environment and modify that:
+
+    temp %*ENV;
+    %*ENV<LANG> = "ja_JP.utf8";   # ok
+    run "greet";
+
+=item *
+
+There is no longer any special package hash such as C<%Foo::>.  Just
+subscript the package object itself as a hash object, the key of which
+is the variable name, including any sigil.  The package object can
+be derived from a type name by use of the C<::> postfix:
+
+    MyType::<$foo>
+
+(Directly subscripting the type with either square brackets or curlies
+is reserved for various generic type-theoretic operations.  In most other
+matters type names and package names are interchangeable.)
+
+Typeglobs are gone.  Use binding (C<:=> or C<::=>) to do aliasing.
+Individual variable objects are still accessible through the
+hash representing each symbol table, but you have to include the
+sigil in the variable name now: C<MyPackage::{'$foo'}> or the
+equivalent C<< MyPackage::<$foo> >>.
+
+=item *
+
+Truly global variables live in the C<*> package: C<$*UID>, C<%*ENV>.
+(The C<*> may be omitted if you import the name from the C<GLOBAL>
+package.)  C<$*foo> is short for C<$*::foo>, suggesting that the
+variable is "wild carded" into every package.
+
+=item *
+
+For an ordinary Perl program running by itself, the C<GLOBAL> and
+C<PROCESS> namespaces are considered synonymous.  However, in certain
+situations (such as shared hosting under a webserver), the actual
+process may contain multiple virtual processes, each running its own
+"main" code.  In this case, the C<GLOBAL> namespace holds variables
+that properly belong to the individual virtual process, while the
+C<PROCESS> namespace holds variables that properly belong to the actual
+process as a whole.  From the viewpoint of the C<GLOBAL> namespace
+there is little difference, since process variables that normally
+appear in C<GLOBAL> are automatically imported from C<PROCESS>.
+However, the process as a whole may place restrictions on the
+mutability of process variables as seen by the individual subprocesses.
+Also, individual subprocesses may not create new process variables.
+If the process wishes to grant subprocesses the ability to communicate
+via the C<PROCESS> namespace, it must supply a writeable variable
+to all the subprocesses granted that privilege.
+
+When these namespaces are so distinguished, the C<*> shortcut always refers
+to C<GLOBAL>.  There is no twigil shortcut for C<PROCESS>.
+
+=item *
+
+The magic command-line input handle is C<$*ARGFILES>.
+The arguments themselves come in C<@*ARGS>.  See also "Declaring a MAIN
+subroutine" in S06.
+
+=item *
+
+Magical file-scoped values live in variables with a C<=> secondary
+sigil.  C<$=DATA> is the name of your C<DATA> filehandle, for instance.
+All pod structures are available through C<%=POD> (or some such).
+As with C<*>, the C<=> may also be used as a package name: C<$=::DATA>.
+
+=item *
+
+Magical lexically scoped values live in variables with a C<?> secondary
+sigil.  These are all values that are known to the compiler, and may
+in fact be dynamically scoped within the compiler itself, and only
+appear to be lexically scoped because dynamic scopes of the compiler
+resolve to lexical scopes of the program.  All C<$?> variables are considered
+constants, and may not be modified after being compiled in.  The user
+is also allowed to define or (redefine) such constants:
+
+    constant $?TABSTOP = 4;     # assume heredoc tabs mean 4 spaces
+
+(Note that the constant declarator always evaluates its initialization
+expression at compile time.)
+
+C<$?FILE> and C<$?LINE> are your current file and line number, for
+instance.  C<?> is not a shortcut for a package name like C<*> is.
+Instead of C<$?OUTER::SUB> you probably want to write C<< OUTER::<$?SUB> >>.
+Within code that is being run during the compile, such as C<BEGIN> blocks, or
+macro bodies, or constant initializers, the compiler variables must be referred
+to as (for instance) C<< COMPILING::<$?LINE> >> if the bare C<$?LINE> would
+be taken to be the value during the compilation of the currently running
+code rather than the eventual code of the user's compilation unit.  For
+instance, within a macro body C<$?LINE> is the line within the macro
+body, but C<< COMPILING::<$?LINE> >> is the line where the macro was invoked.
+See below for more about the C<COMPILING> pseudo package.
+
+Here are some possibilities:
+
+    $?FILE      Which file am I in?
+    $?LINE      Which line am I at?
+    $?PARSER    Which Perl grammar was used to parse this statement?
+    $?LANG      Which Perl parser should embedded closures parse with?
+    &?ROUTINE   Which routine am I in?
+    @?ROUTINE   Which nested routines am I in?
+    &?BLOCK     Which block am I in?
+    @?BLOCK     Which nested blocks am I in?
+    $?LABEL     Which innermost block label am I in?
+    @?LABEL     Which nested block labels am I in?
+
+All the nested C<@?> variables are ordered from the innermost to the
+outermost, so C<@?BLOCK[0]> is always the same as C<&?BLOCK>.
+
+The following return objects that contain all pertinent info:
+
+    $?OS        Which operating system am I compiled for?
+    $?DISTRO    Which OS distribution am I compiling under
+    $?VM        Which virtual machine am I compiling under
+    $?XVM       Which virtual machine am I cross-compiling for
+    $?PERL      Which Perl am I compiled for?
+    $?SCOPE     Which lexical scope am I in?
+    $?PACKAGE   Which package am I in?
+    @?PACKAGE   Which nested packages am I in?
+    $?MODULE    Which module am I in?
+    @?MODULE    Which nested modules am I in?
+    $?CLASS     Which class am I in? (as variable)
+    @?CLASS     Which nested classes am I in?
+    $?ROLE      Which role am I in? (as variable)
+    @?ROLE      Which nested roles am I in?
+    $?GRAMMAR   Which grammar am I in?
+    @?GRAMMAR   Which nested grammars am I in?
+
+It is relatively easy to smartmatch these constant objects
+against pairs to check various attributes such as name,
+version, or authority:
+
+    given $?VM {
+        when :name<Parrot> :ver(v2) { ... }
+        when :name<CLOS>            { ... }
+        when :name<SpiderMonkey>    { ... }
+        when :name<JVM> :ver(v6.*)  { ... }
+    }
+
+Matches of constant pairs on constant objects may all be resolved at
+compile time, so dead code can be eliminated by the optimizer.
+
+Note that some of these things have parallels in the C<*> space at run time:
+
+    $*OS        Which OS I'm running under
+    $*DISTRO    Which OS distribution I'm running under
+    $*VM        Which VM I'm running under
+    $*PERL      Which Perl I'm running under
+
+You should not assume that these will have the same value as their
+compile-time cousins.
+
+=item *
+
+While C<$?> variables are constant to the run time, the compiler
+has to have a way of changing these values at compile time without
+getting confused about its own C<$?> variables (which were frozen in
+when the compile-time code was itself compiled).  The compiler can
+talk about these compiler-dynamic values using the C<COMPILING> pseudopackage.
+
+References to C<COMPILING> variables are automatically hoisted into the
+context currently being compiled.  Setting or temporizing a C<COMPILING>
+variable sets or temporizes the incipient C<$?> variable in the
+surrounding lexical context that is being compiled.  If nothing in
+the context is being compiled, an exception is thrown.
+
+    $?FOO // say "undefined";   # probably says undefined
+    BEGIN { COMPILING::<$?FOO> = 42 }
+    say $?FOO;                  # prints 42
+    {
+        say $?FOO;              # prints 42
+        BEGIN { temp COMPILING::<$?FOO> = 43 } # temporizes to *compiling* 
block
+        say $?FOO;              # prints 43
+        BEGIN { COMPILING::<$?FOO> = 44 }
+        say $?FOO;              # prints 44
+        BEGIN { say COMPILING::<$?FOO> }        # prints 44, but $?FOO 
probably undefined
+    }
+    say $?FOO;                  # prints 42 (left scope of temp above)
+    $?FOO = 45;                 # always an error
+    COMPILING::<$?FOO> = 45;    # an error unless we are compiling something
+
+Note that C<< CALLER::<$?FOO> >> might discover the same variable
+as C<COMPILING::<$?FOO>>, but only if the compiling context is the
+immediate caller.  Likewise C<< OUTER::<$?FOO> >> might or might not
+get you to the right place.  In the abstract, C<COMPILING::<$?FOO>>
+goes outwards dynamically until it finds a compiling scope, and so is
+guaranteed to find the "right" C<$?FOO>.  (In practice, the compiler
+hopefully keeps track of its current compiling scope anyway, so no
+scan is needed.)
+
+Perceptive readers will note that this subsumes various "compiler hints"
+proposals.  Crazy readers will wonder whether this means you could
+set an initial value for other lexicals in the compiling scope.  The
+answer is yes.  In fact, this mechanism is probably used by the
+exporter to bind names into the importer's namespace.
+
+=item *
+
+The currently compiling Perl parser is switched by modifying
+C<< COMPILING::<$?PARSER> >>.  Lexically scoped parser changes
+should temporize the modification.  Changes from here to
+end-of-compilation unit can just assign or bind it.  In general,
+most parser changes involve deriving a new grammar and then pointing
+C<< COMPILING::<$?PARSER> >> at that new grammar.  Alternately, the
+tables driving the current parser can be modified without derivation,
+but at least one level of anonymous derivation must intervene from
+the standard Perl grammar, or you might be messing up someone else's
+grammar.  Basically, the current grammar has to belong only to the
+current compiling scope.  It may not be shared, at least not without
+explicit consent of all parties.  No magical syntax at a distance.
+Consent of the governed, and all that.
+
+=item *
+
+The double-underscore forms are going away:
+
+    Old                 New
+    ---                 ---
+    __LINE__            $?LINE
+    __FILE__            $?FILE
+    __PACKAGE__         $?PACKAGE
+    __END__             =begin END
+    __DATA__            =begin DATA
+
+The C<=begin END> pod stream is special in that it assumes there's
+no corresponding C<=end END> before end of file.  The C<DATA>
+stream is no longer special--any POD stream in the current file
+can be accessed via a filehandle, named as C<< %=POD{'DATA'} >> and such.
+Alternately, you can treat a pod stream as a scalar via C<$=DATA>
+or as an array via C<@=DATA>.  Presumably a module could read all
+its COMMENT blocks from C<@=COMMENT>, for instance.  Each chunk of
+pod comes as a separate array element.  You have to split it into lines
+yourself.  Each chunk has a C<.range> property that indicates its
+line number range within the source file.
+
+The lexical routine itself is C<&?ROUTINE>; you can get its name with
+C<&?ROUTINE.name>.  The current block is C<&?BLOCK>.  If the block has any
+labels, those shows up in C<&?BLOCK.labels>.  Within the lexical scope of
+a statement with a label, the label is a pseudo-object representing
+the dynamic context of that statement.  (If inside multiple dynamic
+instances of that statement, the label represents the innermost one.)
+When you say:
+
+    next LINE;
+
+it is really a method on this pseudo-object, and
+
+    LINE.next;
+
+would work just as well.  You can exit any labeled block early by saying
+
+    MyLabel.leave(@results);
+
+=item *
+
+Heredocs allow optional whitespace both before and after terminating
+delimiter.  Leading whitespace equivalent to the indentation of the
+delimiter will be removed from all preceding lines.  If a line is
+deemed to have less whitespace than the terminator, only whitespace
+is removed, and a warning may be issued.  (Hard tabs will be assumed
+to be C<< ($?TABSTOP // 8) >> spaces, but as long as tabs and spaces are used 
consistently
+that doesn't matter.)  A null terminating delimiter terminates on
+the next line consisting only of whitespace, but such a terminator
+will be assumed to have no indentation.  (That is, it's assumed to
+match at the beginning of any whitespace.)
+
+=head1 NOT YET DEFINED
+
+The following items are not yet defined, but will need to be defined.  
+
+=head2 Form.pm
+
+These go in the Perl5 to Perl6 conversion table:
+
+ Perl6   Perl5
+ -----   -----------------------------------------
+ -       $%  $FORMAT_PAGE_NUMBER
+ -           HANDLE->format_page_number(EXPR)
+
+ -       $=  $FORMAT_LINES_PER_PAGE
+ -           HANDLE->format_lines_per_page(EXPR)
+
+ -       $-  $FORMAT_LINES_LEFT
+ -           HANDLE->format_lines_left(EXPR)
+
+ -       $~  $FORMAT_NAME
+ -           HANDLE->format_name(EXPR)
+
+ -       $^  $FORMAT_TOP_NAME
+ -           HANDLE->format_top_name(EXPR)
+
+ -       $:  $FORMAT_LINE_BREAK_CHARACTERS
+ -           IO::Handle->format_line_break_characters
+
+ -       $^L $FORMAT_FORMFEED
+ -           IO::Handle->format_formfeed
+
+ -       $^A $ACCUMULATOR
+
+
+=head1 Additions
+
+Please post errors and feedback to perl6-language.  If you are making
+a general laundry list, please separate messages by topic.
+
+=for vim:set expandtab sw=4:

Reply via email to