> 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

Reply via email to