Author: lwall
Date: 2010-06-15 22:35:27 +0200 (Tue, 15 Jun 2010)
New Revision: 31270

Modified:
   docs/Perl6/Spec/S03-operators.pod
Log:
[S03] guarantee a monotonic function when single characters are used in a series


Modified: docs/Perl6/Spec/S03-operators.pod
===================================================================
--- docs/Perl6/Spec/S03-operators.pod   2010-06-15 20:23:57 UTC (rev 31269)
+++ docs/Perl6/Spec/S03-operators.pod   2010-06-15 20:35:27 UTC (rev 31270)
@@ -15,8 +15,8 @@
 
     Created: 8 Mar 2004
 
-    Last Modified: 7 Jun 2010
-    Version: 208
+    Last Modified: 15 Jun 2010
+    Version: 209
 
 =head1 Overview
 
@@ -2026,16 +2026,37 @@
 
     1..20, ... "I only know up to 20 so far mister"
 
+A special exception is made for any series whose endpoints are strings that
+happen to represent single codepoints, since the user will typically be 
thinking
+of such strings as characters rather than strings.  If you say something like:
+
+    'A' ... 'z'
+    "\xff" ... "\0"
+
+it is assumed that you aren't interested in carrying within alphabetic
+ranges, so instead of using the ordinary C<.succ>/C<.pred> for
+strings, it uses a monotonic function that increments or decrements
+the underlying codepoint number like
+
+    'A', { $^prev.ord.succ.chr } ... 'z';
+    "\xff", { $^prev.ord.pred.chr } ... "\0";
+
+You will note that this alternate definition doesn't change the meaning of
+any sequence that falls within a conventional range:
+
+    'a'..'z'
+    '9'..'0'
+
 If a series is generated using a non-monotonic C<.succ> function, it is
 possible for it never to reach the endpoint.  The following matches:
 
-    'A' ... 'Z'
+    'A' ... 'ZZ'
 
 but since 'Z' increments to 'AA', none of these ever terminate:
 
-    'A' ... 'z'
-    'A' ... '_'
-    'A' ... '~'
+    'A' ... 'zz'
+    'A' ... '00'
+    'A' ... '~~'
 
 The compiler is allowed to complain if it notices these, since if you
 really want the infinite list you can always write:
@@ -2050,20 +2071,20 @@
 
 The astute reader will note that
 
-    'A' ... 'Z'
+    'A' ... 'ZZ'
 
 doesn't terminate with a simple C<!after> test either.  The actual function 
used
 is something like:
 
-    'A', *.succ ... -> $old,$new { $old ne 'Z' and $new !after 'Z'; }
+    'A', *.succ ... -> $old,$new { $old ne 'ZZ' and $new !after 'ZZ'; }
 
 Likewise, since Z comes after A:
 
-    'Z' ... 'A'
+    'ZZ' ... 'AA'
 
 uses the function:
 
-    'Z', *.pred ... -> $old,$new { $old ne 'A' and $new !before 'A'; }
+    'ZZ', *.pred ... -> $old,$new { $old ne 'AA' and $new !before 'AA'; }
 
 For purposes of deciding when to terminate the eager part of a 'mostly
 eager' list, any series that terminates with an exact value (or

Reply via email to