The loop in the move generator of the betza.txt include file for generating slider moves looks like this:
set k 1;
do while < #k #r and not #hit: // for non-final (and thus empty) squares
set to elem dec #k #tosqrs;
if #togo:
set newindex + 4 #legindex; // another leg follows
gosub NextLeg #togo #newindex #startsqr #to #locustsqr #dropsqr #k;
else:
gosub GotMove #startsqr #to #locustsqr #dropsqr 0 0;
endif;
if & << 1 23 #mode:
push eps #to;
endif;
inc k;
if == 4 #task:
print . L_ #hit;
endif;
loop;
where #tosqrs is an array of all the empty squares on the slider path. The variable #hit, initialized to false, serves for flagging if the sought move (e.g. the entered one, a legal one or capture of a royal) has been found, so that move generation should be aborted.
In the mate test (where #task equals 4) for the position given by Carlos below, the move Qe3-h6 is correctly found to be a legal one, which sets #hit, as is confirmed by the printing of L_1 by the print statement I inserted for debugging. As far as I understand this should have terminated the do-while loop, as not #hit is then no longer true. But the loop happily continues with the move Qe3-i7 (the next empty square in that direction), and subsequently generates all other pseudo-legal moves for the position. The last one being illegal because it does not evade the Sissa check, so that the verdict 'checkmate' results.
What is going on here that makes the loop continue?
It seems I need @Fergus for this.
The loop in the move generator of the betza.txt include file for generating slider moves looks like this:
where #tosqrs is an array of all the empty squares on the slider path. The variable #hit, initialized to false, serves for flagging if the sought move (e.g. the entered one, a legal one or capture of a royal) has been found, so that move generation should be aborted.
In the mate test (where #task equals 4) for the position given by Carlos below, the move Qe3-h6 is correctly found to be a legal one, which sets #hit, as is confirmed by the printing of L_1 by the print statement I inserted for debugging. As far as I understand this should have terminated the do-while loop, as not #hit is then no longer true. But the loop happily continues with the move Qe3-i7 (the next empty square in that direction), and subsequently generates all other pseudo-legal moves for the position. The last one being illegal because it does not evade the Sissa check, so that the verdict 'checkmate' results.
What is going on here that makes the loop continue?