Date: Tue Jan 30 12:11:00 2007
New Revision: 13549
Disabled negative subscript dwimmery for all shaped arrays.
* can now take + and - operators.
--- doc/trunk/design/syn/S09.pod (original)
+++ doc/trunk/design/syn/S09.pod Tue Jan 30 12:11:00 2007
@@ -12,9 +12,9 @@
Maintainer: Larry Wall <[EMAIL PROTECTED]>
Date: 13 Sep 2004
- Last Modified: 1 Oct 2006
+ Last Modified: 30 Jan 2007
- Version: 15
+ Version: 16
@@ -763,4 +763,54 @@
This rule applies to C<Array>, C<Hash>, and C<Scalar> container objects.
+=head1 Negative subscript dwimmery
+It has become the custom to use negative subscripts to indicate counting
+from the end of an array. This is still supported, but only for unshaped
+ my @a1 = 1,2,3;
+ my @a2[*] = 1,2,3;
+ @a1[-1] # 3
+ @a1[-0.5] # also 3 (uses floor semantics)
+ @a2[-1] # ERROR
+ @a2[-0.0001] # ERROR
+ @a2[0.0001] # 1
+For shaped arrays you must explicitly refer to the current endpoint
+using C<*>, the C<Whatever> object:
+ @a2[*-1] # 3
+ @a2[+*] = 1 # same as push(@a2, 1)
+When you use C<*> with C<+> and C<->, it creates a value of C<Whatever>
+but C<Num>, which the array subscript interpreter will interpret as the
+subscript one off the end of that dimension of the array. The lower
+right corner of a two dimesional array is C<@array[*-1, *-1]>.
+This policy has the fortuitous outcome that arrays declared with negative
+subscripts will never interpret negative subscripts as relative to the end:
+ my @array[-5..5];
+ @array[-1]; # always the 4th element, not the 11th.
+ @array[*-1]; # always the 11th element, not the 4th.
+Oddly, this gives us a canonical way to get the last element, but no
+canonical way to get the first element, unless
+Conjecture: we might provide a way to declare a modular subscript that
+emulates the dwimmery, perhaps by using a subset type:
+ subset Mod10 of Int where ^10;
+ my @array[Mod5];
+ @array = 1; # sets @array
+ @array; # returns 1
+But perhaps C<Mod10> should work just like C<^10>, and the modular behavior
+requires some extra syntax.
=for vim:set expandtab sw=4: