Luke Palmer skribis 2005-03-28 6:57 (-0700):
> We were discussing on #perl6, and thought that the feature:
> sub foo () {
> say "Blech";
> }
> { foo() } xx 5;
In the context of x, it makes even more sense. Especially if you
consider, for example, creating a random password:
my $password = { any('a'..'z').pick } x 5;
This can be done with join+map, of course, but map really isn't the
right idiom visually, because you just want the closure to be called
repeatedly, not transform a list.
For reference, this is one way to do it with join and map:
my $password = map { any('a'..'z').pick }, 1..5;
The thing that I find wrong with that is the range - 2..6 would have
accomplished the same thing. Only the 5 is important, the 1.. is not.
> Does the convenience (and obviousness when reading) enough to warrant
> adding a special case in this situation?
I certainly think so.
If a special case is not warranted, perhaps we can introduce another set
of x-ish operators, that do something special with the LHS, while x and
xx leave the LHS intact. They could be X and XX or *x and *xx, or
whatever. I'll use X and XX to demonstrate:
@foo xx 5 # [EMAIL PROTECTED], 5 times
{ foo } xx 5 # 5 times the same closure
@foo XX 5 # @foo's elements, repeated 5 times
{ foo } XX 5 # execute foo 5 times and collect its elements
IMHO, the special case is more useful, and using a temporary variable is
a good enough way to disambiguate in the rare case that you actually
want to repeat a closure. (Which with string x is even less of a
problem, because you don't often want five equal stringified closures
:).)
Juerd
--
http://convolution.nl/maak_juerd_blij.html
http://convolution.nl/make_juerd_happy.html
http://convolution.nl/gajigu_juerd_n.html