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