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

Reply via email to