Larry wrote:

>      sub while (&test is rx/<expr>/, &body);
> 
> or some such.  That probably isn't sufficient to pick <expr> out of Perl's
> grammar rather than the current lexical scope.


I love the idea, but the property name needs to be more expressive
(and Huffmanly longer). Maybe:

        sub while (&test is specified(/<Perl.expr>/), &body);


C<rx> is not ideal because it would also be very useful to
be able to select between variants of a multimethod by matching a
pattern against the *value* of an argument. That is:

        sub repeat is multi ($count is valued(/\d+/),  &body) {
            body($_) for 1..$count;
        }

        rule et_cetera :w { forever | ad nauseum | etc | et cetera }
        sub repeat is multi ($desc is valued(/<et_cetera>/),  &body) {
            body($_) for 1..Inf;
        }

        # and then...

        repeat 2 { print "cha" }
        repeat 'forever' { print "ha" }
        repeat $count { print "ha" }

And, of course, the C<is valued> property would smart-match its value
against the corrresponding argument, so one could also code optimized
variants like:

        sub repeat is multi ($desc is valued(1),  &body) {
            body(1);
        }

        sub repeat is multi ($desc is valued(0),  &body) {
        }

        sub repeat is multi ($desc is valued(['A'..'F']),  &body) {
            die "Can't repeat hexadecimally";
        }

Come to think of it, maybe the property name probably should be C<is when>.


> I don't particularly like the old map and grep syntax.

Recently someone suggested to me (sorry, whoever it was, my memory
is still in anyother timezone) that, since C<given> returns a value:

        $val = given $digit {
                case [0..9]     { $_ }
                case ['A'..'F'] { 10+ord($_)-ord('A') }
                default         { undef }
        };

then maybe the other control structues should as well:

        @squares = map { $_**2 } @nums;

        @squares = for @nums { $_**2 };

Of course, this example is trivially done with a hyperoperation:

        @ squares = @nums ^** 2;

But more complex examples could easily be constructed where even C<map>
looks clunky and a list context C<for> would be a nice solution.

It would also solve the problem of early escape:

        @smallsquares = for @nums { last if $_ > 10; $_**2 };
        

Damian


Reply via email to