On Wed, 28 Aug 2002, Thom Boyer wrote: : Damian Conway wrote: : > Any subroutine/function like C<if> that has a signature (parameter list) : > that ends in a C<&sub> argument can be parsed without the trailing : > semicolon. So C<if>'s signature is: : > : > sub if (bool $condition, &block); : : So what does the signature for C<while> look like? I've been wondering about : this for a long time, and I've searched the Apocalypses and the : perl6-language archive for an answer, but I've had no success. : : It seems like C<while>'s signature might be something like one of these: : : sub while (bool $test, &body); : sub while (&test, &body); : : But neither of these really works.
That's correct. Maybe something like sub while (&test is expr, &body); But that would be shorthand for something more general--see below. : The first would imply that the test is evaluated only once (and that once is : before 'sub while' is even called). That'd be useless. : : The second would allow multiple evaluations of the test condition (since : it's a closure). But it seems that it would also require the test expression : to have curly braces around it. And possibly a comma between the test-block : and the body-block. That'd be ugly. Maybe we could have something like: 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 can create a hypothetical "bareblock" rule that says: : : When an argument's declaration contains an ampersand sigil, : then you can pass an "expression block" (i.e., a simple : expression w/o surrounding curlies) to that argument. : : Is there such a rule for Perl 6? Not at the moment. It'd be pure obfuscation if people did that where curlies *are* expected. I still want the curlies required on an "else", for instance. : On the positive side, this would be an reasonable generalization of the Perl : 5 handling of expressions given to map or grep. I don't particularly like the old map and grep syntax. : On the negative side, this : rule makes it impossible to have such arguments fulfilled by evaluating an : expression that returns the desired closure (i.e., the expression you type : as an argument isn't intended to be the block you pass, but rather it is : intended to generate the block you want to pass). Well, we could make the same sort of rule that we (eventually) did for bare blocks--if you want to return a closure in that circumstance you'd have to use "sub' (or "return", in the case of a bare block). : In summary: assuming Perl 6 allows user-defined while-ish structures, how : would it be done? I think the secret is to allow easy attachment of regex rules to sub and parameter declarations. There's little point in re-inventing regex syntax using declarations. The whole point of making Perl 6 parse itself with regexes is to make this sort of stuff easy. Larry