This ticket is about two currently skipped tests in
S03-operators/flip-flop.t.

The tests in question check how often the left hand side (lhs) and
right hand side (rhs) are evaluated against $_ when using the
operators 'ff' and 'fff', respectively:

# make sure {lhs,rhs} isn't evaluated when state is {true,false}
#?rakudo skip 'dubious scoping? RT #124548'
{

    # keep track of # of times lhs and rhs are EVAL'd by adding
    # a state var to both sides.
    sub ff_eval($code, $lhs, $rhs, @a) {
        my $lhs_run = 0;
        my $rhs_run = 0;

        for @a { $code.({$lhs_run++; ?$lhs}, {$rhs_run++; ?$rhs}); }

        return [$lhs_run, $rhs_run];
    }

    is-deeply ff_eval({@_[0]() ff @_[1]()}, /B/, /B/, <A B A B A>),
        [5, 2], "count lhs & rhs evals for ff";

    is-deeply ff_eval({@_[0]() fff @_[1]()}, /B/, /B/, <A B A B A>),
        [3, 2], "count lhs & rhs evals for fff";
}

Currently, the second test passes, but the first fails because the sub
returns [5, 5]. So lhs and rhs are evaluated 5 times both. After looking
at the speculations (S03), the docs (doc/Language/operators.pod) and
the implementation (sub flipflop src/Perl6/Actions.nqp) I'm under the
impression that [5, 5] is a sensible answer.

* S03 states: "The two sides of a flipflop are evaluated as smartmatches
  against the current value of the topic stored in $_.". 

  That's in line with current behaviour.

* http://doc.perl6.org/routine/ff states: "Compares both arguments to
  $_ (that is, $_ ~~ $a and $_ ~~ $b)." 

  That's also in line with current behaviour. 
  
* src/Perl6/Actions.nqp: There is the following explicit comment in
  sub flipflop:

  # Evaluate LHS and RHS. Note that in one-only mode, we use                    
                           
  # the state bit to decide which side to evaluate.

All in all, I think the first tests is wrong and should be changed.
(I guess, no adjustments in 6.c-errata are necessary since the test
was skipped there.)

Reply via email to