1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Conditional expressions in a variable?

Discussion in 'Support' started by vefatica, Oct 3, 2012.

  1. vefatica

    Joined:
    May 20, 2008
    Messages:
    8,079
    Likes Received:
    30
    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:\>
     
  2. rconn

    rconn Administrator
    Staff Member

    Joined:
    May 14, 2008
    Messages:
    10,040
    Likes Received:
    84
    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. vefatica

    Joined:
    May 20, 2008
    Messages:
    8,079
    Likes Received:
    30
    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).
     

Share This Page