Maintainer: Adriano Ferreira <ferreira@cpan.org> Date: 17 Dec 2007 Last Modified: 18 Dec 2007 Number: 9 Version: 3
Status: Draft
In Perl 6, you may construct ranges with expressions like
$min .. $max $min ^.. $max $min ..^ $max $min ^..^ $max
and even
^$limit
These operators are Range object constructors, specified by
their endpoints. These endpoints are excluded if there is
^ in the corresponding side of the range operator. Thus,
0 ..^ 4 # equivalent to 0, 1, 2, 3 1 .. 4 # equivalent to 1, 2, 3, 4 1 ^.. 3 # equivalent to 2, 3 -2 ^..^ 2 # equivalent to -1, 0, 1
Range objects are lazy iterators. So they can represent efficiently very large or even infinite lists.
Reversed ranges cannot be constructed by just exchanging the endpoints.
So 2..1 is always a null range. The solution is to use one of the
expressions below.
2 .. 1 :by(-1) reverse 1 .. 2
where reverse has the benefit of working even for alphabetic ranges.
To build possibly unbounded ranges, * may occur in any of the
endpoints.
0..* # 0 .. +Inf 'a'..* # 'a' .. 'zzzzz...' *..0 # -Inf .. 0 1.2.3..* # Any version higher than 1.2.3 May..* # May through December
These examples also show that to build ranges it is enough
to have endpoints whose types are Ordered, which basically
means there exist sensible comparisons among its instances.
To know more about Perl 6 Ranges, their methods
and expected semantics, read
section "Range Semantics" from Synopsis 03 .
The upto operator (unary '^')
is really a shortcut to generate a range from 0
up to one less than its argument.
^$limit # 0 ..^ $limit
which is handy for cases like this:
.say for ^4 # 0, 1, 2, 3
If applied to a type name, ^Moose is short for Moose.HOW,
taking from its argument to the metaclass instance instead.
This behavior is akin to "what's this thing's domain" which
correlates abstractly to how ^$n works.
The operator '..' was relieved of the Perl 5 semantics
of flip-flop operator, whose Perl 6 counterpart will be seen
in yet another article of this series.
As a curiosity, notice that to construct ranges
within Perl 6 regular expressions, the '-'
was consistently replaced by '..'.
tr/a..z/A..Z/;
$Revision: 94 $