On Tue, Jul 20, 2010 at 07:31:14PM -0400, Aaron Sherman wrote:
2) We deny that a range whose LHS is larger than its RHS makes sense, but
we also don't provide an easy way to construct such ranges lazily otherwise.
This would be annoying only, but then we have declared that ranges are the
right way to construct basic loops (e.g. for (1..1e10).reverse - $i {...}
which is not lazy (blows up your machine) and feels awfully clunky next to
for 1e10..1 - $i {...} which would not blow up your machine, or even make
it break a sweat, if it worked)
There is no reason why for (1..1e10).reverse - $i {...} should *not* be lazy.
After all, Perl 5 now implements
@b = reverse sort @a
by directly sorting in reverse. Note how it's now an ex-reverse:
$ perl -MO=Concise -e '@b = reverse sort @a'
c @ leave[1 ref] vKP/REFC -(end)
1 0 enter -2
2 ; nextstate(main 1 -e:1) v -3
b 2 aassign[t6] vKS -c
-1 ex-list lK -8
3 0 pushmark s -4
- 1 ex-reverse lK/1 --
4 0 pushmark s -5
7 @ sort lK/REV -8
- 0 ex-pushmark s -5
6 1 rv2av[t4] lK/1 -7
5# gv[*a] s -6
-1 ex-list lK -b
8 0 pushmark s -9
a 1 rv2av[t2] lKRM*/1 -b
9 # gv[*b] s -a
-e syntax OK
Likewise
foreach (reverse @a) {...}
is implemented as a reverse iterator on the array, rather than a temporary
list:
$ perl -MO=Concise -e 'foreach(reverse @a) {}'
d @ leave[1 ref] vKP/REFC -(end)
1 0 enter -2
2 ; nextstate(main 2 -e:1) v -3
c 2 leaveloop vK/2 -d
7{ enteriter(next-9 last-c redo-8) lKS/REVERSED -a
- 0 ex-pushmark s -3
- 1 ex-list lKM -6
3 0 pushmark s -4
- 1 ex-reverse lKM/1 -6
- 0 ex-pushmark s -4
5 1 rv2av[t2] sKR/1 -6
4# gv[*a] s -5
6 # gv[*_] s -7
-1 null vK/1 -c
b | and(other-8) vK/1 -c
a 0 iter s/REVERSED -b
- @ lineseq vK --
8 0 stub v -9
9 0 unstack v -a
-e syntax OK
If it's part of the specification that (1..1e10).reverse is to be implemented
lazily, I'd (personally) consider that an easy enough way to construct a lazy
range.
This doesn't answer any of your other questions about what ranges of
character strings should mean. I don't really have an opinion, other than
it needs to be simple enough to be teachable.
Nicholas Clark