On 2010-07-31, at 5:55 pm, Darren Duncan wrote:
> I would prefer if given/when was nothing more than an alternate syntax for 
> if/then that does comparisons. 

And that breaks out of its enclosing scope.

> On the other hand, Perl 6 has multiple equality comparison operators, eqv, 
> eq, ==, ===, etc, and hence ~~ semantics instead of eqv may seem to make some 
> sense, though I think that would cause more problems.

Yes, since if you've got a whole list of when's to compare against, it's not 
unlikely that they're different types of things, so ~~ would be more useful 
than === or eqv.  Of course, given the bool-exception spec, one workaround is 
"when $_ eqv $x".  But I was already thinking of a more elegant possibility.

Using "when ~~ $bar" is problematic because Perl couldn't know whether to 
expect a term or an operator after "when".  But what if ~~ were merely the 
default operator, and you could override it?

    given $foo :using( [===] ) { ... }
    given $foo :using(&binary-func) { ... }

such that any 'when's inside the block use ===, or the provided 
operator/function instead, of ~~.  Actually, the option should be on 'when', so 
that above line would mean something like:

    given $foo { my &when = &when.assuming( :using( [===] )) ... }

...er, except 'when' isn't a function, so that doesn't actually work.  Anyway, 
the idea is that there could be some way to set the default operation to use 
for 'when' in a given scope.  


Here's another thought: 'when' is different from 'if' in two ways.  One is that 
it does an implicit comparison on the topic; the other is that it breaks out of 
its enclosing block.  Maybe the comparison could be indicated another way, 
leaving 'when' and 'if' to differ in breaking out or not.  Suppose a colon 
indicated "compare against $_ using ~~, or whatever the default operation is" 
(we're not using the colon for anything else, are we?!?):

    when $a > $b { ... }
    if $foo.does($bar) { ... }
    
    when: /foo/ { ... }
    if: .defined { ... }


-David

Reply via email to