In "Junction Algebra", Martin Kealey wrote:
> On Mon, 30 Mar 2009, Mark J. Reed wrote:
>> > ( $a <= any(-1,+1) <= $b ) == ( $a <= any(-1,+1) && any(-1,+1) <=
>> > $b )
>>
>> Clearly, the RHS is true for $a == $b == 0, but I'm not sure the LHS
>> shouldn't also be. Isn't it just syntactic sugar for the RHS?
>
> I suspect not. Rather I think that
>
> $a <= any(-1,+1) <= $b
>
> corresponds to
>
> $tmp = any(-1,+1);
> $a <= $tmp <= $b
>
> and thence to
>
> $tmp = any(-1,+1);
> $a <= $tmp && $tmp <= $b
>
> The more I think about this, the more I come to the conclusion that a
> junction should appear to have a uniform (single) value in each
> "eigenthread".
Ugh. Let me float another problem, and a possible solution to both,
that doesn't require persistent threading environments:
$x = -1 | +1;
if $x > 0 { say $x }
As I understand junctions right now, the result of this code is identical to:
say -1 | +1;
In both cases, the problem arises when you apply a predicate to a
junction, and then use the junction within code that only gets
executed according to the truth of the predicate.
The possible solution to both of these: junctions collapse when they
hit conditional statements - but only within the "conditioned scope".
So: within the code block for the "if $x > 0" statement above, $x only
equals +1, since -1 didn't pass the test. Thus, "say $x" is the same
as "say 1". In the case of the range test, the code on the RHS of the
&& only executes if the code on the LHS evaluated to true; therefore,
when evaluating the RHS, "$tmp" doesn't include any of the
possibilities that would have failed on the LHS. That means that:
0 <= -1 | +1 <= 0
...becomes:
0 <= -1 | +1 && +1 <= 0
...which, obviously, is false.
Extending this further:
$x = +1 | -1;
if $x > 0 { say "$x is positive." }
else { say "$x is negative." }
I suspect that both codeblocks would be executed; but within the first
block, $x == +1, and within the second codeblock, $x == -1.
$x = +1 | -1;
say $x > 0 ?? $x + 2 :: $x * 2;
In this case, $x is +1 when evaluating "$x + 2", and it is -1 when
evaluating "$x * 2". After this expression is fully evaluated, they
get recombined into a single junction: +3 | -2.
This last one might be easier to manage simply by having $x autothread
through the "?? ::" operator, since you need to be able to reassemble
a junction on the other end.
--
Jonathan "Dataweaver" Lang