Author: larry
Date: Wed Feb 7 11:29:13 2007
New Revision: 13573
Modified:
doc/trunk/design/syn/S02.pod
Log:
Clarified one-pass parsing of heredocs, and a restriction based on that.
Changed list() comprehension to each() which came available and reads better.
Removed misleading fossil about spaces on dot methods in interpolations.
Modified: doc/trunk/design/syn/S02.pod
==============================================================================
--- doc/trunk/design/syn/S02.pod (original)
+++ doc/trunk/design/syn/S02.pod Wed Feb 7 11:29:13 2007
@@ -12,9 +12,9 @@
Maintainer: Larry Wall <[EMAIL PROTECTED]>
Date: 10 Aug 2004
- Last Modified: 29 Jan 2007
+ Last Modified: 7 Feb 2007
Number: 2
- Version: 83
+ Version: 84
This document summarizes Apocalypse 2, which covers small-scale
lexical items and typological issues. (These Synopses also contain
@@ -2154,8 +2154,7 @@
print "The attribute is @baz[3](1,2,3){$xyz}<blurfl>.attr().\n"
Note that the final period above is not taken as part of the expression since
-it doesn't introduce a bracketed dereferencer. Spaces are not allowed
-between the dereferencers even when you use the dotted forms.
+it doesn't introduce a bracketed dereferencer.
=item *
@@ -2469,7 +2468,7 @@
=item *
-Here docs allow optional whitespace both before and after terminating
+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
@@ -2480,6 +2479,37 @@
will be assumed to have no indentation. (That is, it's assumed to
match at the beginning of any whitespace.)
+=item *
+
+There are two possible ways to parse heredocs. One is to look ahead
+for the newline and grab the lines corresponding to the heredoc, and
+then parse the rest of the original line. This is how Perl 5 does it.
+Unfortunately this suffers from the problem pervasive in Perl 5 of
+multi-pass parsing, which is masked somewhat because there's no way
+to hide a newline in Perl 5. In Perl 6, however, we can use "unspace"
+to hide a newline, which means that an algorithm looking ahead to find
+the newline must do a full parse (with possible untoward side effects)
+in order to locate the newline.
+
+Instead, Perl 6 takes the one-pass approach, and just lazily queues
+up the heredocs it finds in a line, and waits until it sees a "real"
+newline to look for the text and attach it to the appropriate heredoc.
+The downside of this approach is a slight restriction--you may not use
+the actual text of the heredoc in code that must run before the line
+finishes parsing. Mostly that just means you can't write:
+
+ BEGIN { say q:to/END/ }
+ Say me!
+ END
+
+You must instead put the entire heredoc into the C<BEGIN>:
+
+ BEGIN {
+ say q:to/END/;
+ Say me!
+ END
+ }
+
=back
=head1 Context
@@ -2541,10 +2571,10 @@
=item *
-When evaluating chained operators, if a C<list()> occurs anywhere in that
+When evaluating chained operators, if an C<each()> occurs anywhere in that
chain, the chain will be transformed first into a C<grep>. That is,
- for 0 <= list(@x) < all(@y) {...}
+ for 0 <= each(@x) < all(@y) {...}
becomes
@@ -2554,7 +2584,7 @@
preserved in the returned list, and duplicate elements in C<@x> are
preserved as well. In particular,
- @result = list(@x) ~~ {...};
+ @result = each(@x) ~~ {...};
is equivalent to
@@ -2563,7 +2593,7 @@
However, this I<list() comprehension> is strictly a syntactic transformation,
so a list computed any other way will not triger the rewrite:
- @result = (@x = list(@y)) ~~ {...}; # not a comprehension
+ @result = (@x = each(@y)) ~~ {...}; # not a comprehension
=item *