On the one hand, I've had 25 years of being annoyed about the idiom
if foo() == True ...
So I'd be delighted if P6 were to treat that case as a fatal compile-time
error.
And given that "==" are "!=" are just funny ways of writing "!xor" and
"xor", that prohibition could reasonably be extended to all statically-typed
expressions (not just constants), with the error message suggesting the use
of "!xor" or "xor" instead.
On the other hand it feels it'd be wrong if foo() ~~ bar() simply ignored
the value of one of its operands based on the type of the other.
Overall I'd rather see a solution that factors out the implicit "last" from
the implicit "$_ ~~".
My feeling is that "if" and "when" should be for the implicit "last", since
they're all alphabetic tokens; then it's just a case of deciding how to
spell the contextualizer. The most obvious would be
if == VALUE-TO-MATCH {...}
if ~~ VALUE-TO-MATCH {...}
when == VALUE-TO-MATCH {...}
when ~~ VALUE-TO-MATCH {...}
however I'm not sure if that conflicts with any prefix:<~~> or
prefix:<==>, and it also conflicts with Huffmanizing the implicit match
to something shorter than the explicit comparison.
One possibility is to make all options explicit:
if= VALUE-TO-MATCH {...} # no implicit last
if? BOOLEAN-EXPRESSION {...}
if~ VALUE-TO-SMARTMATCH {...}
when= VALUE-TO-MATCH {...} # implicit last
when? BOOLEAN-EXPRESSION {...}
when~ VALUE-TO-SMARTMATCH {...}
and then make bald "if" and "when" be DWIMmy shorthand.
Oh, and then "A ~~ B" just works like "?! (A) xor B", if B is a Bool.
-Martin
PS: I also considered some other possibilities, but I don't like them as
much:
if -> VALUE-TO-MATCH {...}
when -> VALUE-TO-MATCH {...}
-> if VALUE-TO-MATCH {...}
-> when VALUE-TO-MATCH {...}
.if VALUE-TO-MATCH {...}
.when VALUE-TO-MATCH {...}
==> if VALUE-TO-MATCH {...}
==> when VALUE-TO-MATCH {...}