Conditional expressions in a variable?

#1
I have a rather long conditional expression which must appear several times in a BTM file. My first, simple, attempt at putting a conditional expression in a variable failed (se below) is there any way to do it?

Code:
v:\> set condition=`%a == %b`
 
v:\> set condition
%a == %b
 
v:\> set a=1
 
v:\> set b=1
 
v:\> echo %condition
1 == 1
 
v:\> if %condition echo yes
 
v:\>
 

rconn

Administrator
Staff member
May 14, 2008
10,533
94
#2
It's not possible with that syntax -- you're trying to nest IF expansion, which would break a few zillion batch files. I.e., what would happen with something like:

if "%condition"=="true" echo true

What you want it to do is to expand %condition, and then rewind the parser to the second word inside the first argument. The consequences everywhere else would be horrible.

Use %@IF -- that's what it was designed for.
 
#3
It's not possible with that syntax -- you're trying to nest IF expansion, which would break a few zillion batch files. I.e., what would happen with something like:

if "%condition"=="true" echo true

What you want it to do is to expand %condition, and then rewind the parser to the second word inside the first argument. The consequences everywhere else would be horrible.

Use %@IF -- that's what it was designed for.
I wanted to test this (paraphrased, a win in tic-tac-toe, repreatedly)
Code:
(b0==b1 && b1==b2) || (b3==b4 && b4==b5) || (b6==b7 && b7==b8) || (b0==b3 && b3==b6) || (b1==b4 && b4==b7) || (b2==b5 && b5==b8) || (b0==b4 && b4==b8) || (b2==b4 && b4==b6)
In C, a macro works nicely and I was hoping to do something similar in a BTMfile. I wound up with a subroutine:
Code:
:winner
    if %b[0] == %b[1] .and. %b[1] == %b[2] return 1
    if %b[3] == %b[4] .and. %b[4] == %b[5] return 1
    if %b[6] == %b[7] .and. %b[7] == %b[8] return 1
    if %b[0] == %b[3] .and. %b[3] == %b[6] return 1
    if %b[1] == %b[4] .and. %b[4] == %b[7] return 1
    if %b[2] == %b[5] .and. %b[5] == %b[8] return 1
    if %b[0] == %b[4] .and. %b[4] == %b[8] return 1
    if %b[2] == %b[4] .and. %b[4] == %b[6] return 1
    return 0
and
Code:
 iff %@exec[gosub winner] EQ 1 then ...
This saves (some) unnecessary variable expansion as would occur with with the conditional expression all on one line (as it would be with %@IF or even my environment variable idea). Have you any ideas for making it faster?

History: Two complete idiots play tic-tac-toe, randomly choosing (from the empty squares) where to put their mark. What is the probability that such a game will result in a win? At first I MonteCarlo'd it ... in C, taking overnight, 10,000,000,000 games to get a solid 6-decimal place estimate. Then I simply played all 9! possible games and got the exact answer; that took a split second in C and about 4 hours with a batch file (just for kicks)). The answer, somewhat surprisingly, is exactly 55/63 (about .873).