> Hmm. A hyperdwim operator. So that means that
>
> @result = @a ^=~ @b
>
> is the same as
>
> @result = map -> $a; $b { $a =~ $b } (@a; @b)
>
> Or something resembling that that actually works...
>
> Hmm. I suppose it could be argued that a C<for> in list context:
>
> @result = for @a; @b -> $a; $b { $a =~ $b }
>
> should have the same effect. I almost like that.
It would be nice to retire C<map>.
And list-context C<for> is an elegant and more-powerful solution.
However, it doesn't generalize to cover C<grep> well, or C<reduce>,
or C<fold>, C<spindle>, or C<mutilate> (or whatever you're actually
going to call the various multidimensional restructuring methods ;-).
You *could* instead consider reversing the arguments to all the list
manipulation operators:
@result = map @data { mapping() }
@result = grep @data { selector() };
@result = sort @data { comparison() };
@result = reduce @data { combinator() };
Then you would have the possibility of:
@result = map @data -> $x { mapping($_, $x) }
@result = map @data1;@data2 -> $x1;$x2 { $x1 =~ $x2 }
@result = grep @data -> $a, $b { two_at_a_time($a, $b) };
In addition, the slightly odd, right-to-left evaluation of pipelined
data would be (partially) rectified. The Perl5-ish:
@sorted_by_size =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, -s] }
@files;
would become:
@sorted_by_size =
map sort map @files
{ [$_, -s] }
{ $^a[1] <=> $^b[1] }
{ $_[0] };
Though I suppose the method call approach solves that nicely too:
@sorted_by_size =
@files.map( { $_[0] })
.sort({ $^a[1] <=> $^b[1] })
.map( { [$_, -s] });
with the operations reading left-to-right, down the page.
Of course, now that I consider it, also solves most of the original problem:
@result = @data.map(->$x { mapping($_, $x) });
@result = @data.grep(->$a,$b { two_at_a_time($a, $b) });
It would be nice if it also solved the "parallel iteration" case, but
I guess that's rare and complex enough that a real C<for> is warranted anyway.
I suppose this discussion also raises the vexed question whether ??::
can also be put out to pasture in favour of:
$val = if $x { 1 } else { 2 }
Or if the latter should perhaps be added as an alternative to:
$val = $x ?? do{ something_more_complex_than_an_expression }
:: do{ operation_at_lower_precedence_than_ternary };
at least.
Not to mention:
@squares = while <> { $_**2 };
Damian