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