On Tue, Aug 24, 2004 at 02:31:00PM -0400, Aaron Sherman wrote:
: On Tue, 2004-08-24 at 08:24, Aaron Sherman wrote:
:
: > $foo => 'a' or 'b'
:
: I was too focused on the idea of C<??>/C<::> as a pair-like construct,
: and I missed what should have been obvious:
:
: a ?? b :: c
:
: IS
:
: given a { when true { b } default { c } }
I don't think so. It's really much more like:
if a { b } else { c }
: Which S4 tells us is:
:
: a -> $_ { when true { b } default { c } }
:
: If you take the C<??> out of the ternary expression and make it a
: generic, binary logical operator that tests the topic for truth and
: executes lhs if topic is true and rhs if it is false, then that becomes:
:
: a -> $_ { b ?? c }
:
: And further S4 tells us that that can become:
:
: a ~~ b ?? c
:
: because C<~~> automatically topicalizes its lhs for its rhs.
:
: So, with the very minor change of making C<??> binary instead of
: ternary, it turns out that we ALREADY HAVE a replacement for C<?:>, and
: didn't realize it!
Two big problems. First, it goes against an aspect of C culture
that the current ??:: preserves. Second, it has the wrong precedence.
The ~~ wants to be the precedence of a comparison operator, which want
to be tighter than the logical operators, which in turn wants to be
tighter than ??::.
: C<??> would also be darn useful in all sorts of places, as this lets you
: write things like:
:
: given a {
: b ?? c;
: say "We did the first step";
: d ?? e;
: say "We did the second step";
: }
:
: etc. My $0.02, but I think this is the way to go, and the whole C<::>
: thing just fades into historical note land.
I suspect such a use of ?? would be completely opaque to most people.
The small factorization win doesn't seem to me to be of sufficient
benefit to overcome all the problems.
Larry