btm file command line augments comparing for string or math.

Mar 6, 2019
10
0
i've tried to research it especially in the help file but i'm not getting it.
i'm thinking somewhere between numerical and eval lies my answer but i'm still not getting it.
I get close..but not right.

I'd like to compare the command line augments to see if it's a mathematical equation and if so echo %@eval the augments
and if it's not mathematic do a google search on the string..

i'm sure it's simple for you programmers and those long experienced with tcc.. but i can't figure it out.
can someone show me how it should be done? hopefully i'll then pickit up and understand it once i see it done.
 
Here is one way of doing what you want;
Code:
@setlocal
@echo off
:: TCC  24.01.41 x64   Windows 7 [Version 6.1.7601]

iff %# gt 0 then
  set mycalc=%$
else
  set mycalc=2019-1956/(10-2)
endiff

set theLen=%@len[%mycalc]
set TPunct=%@tpunct[%mycalc]
set TDigit=%@tdigit[%mycalc]
echo TPunct+TDigit: %@eval[%TPunct+%TDigit]
echo theLen       : %theLen
iff %@eval[%TPunct+%TDigit] eq %theLen then
  echo %mycalc contains only Numeric Digits and punctuation characters
  echo This can be used as a math function
  echo %%@eval[%%mycalc] = %@eval[%mycalc]
else
  echo The %%mycalc variable cannot be used as a math function
  echo Doing a Google search of %mycalc
  https://www.google.ca/search?q="%mycalc"
endiff
Example runs;
Code:
c:\users\jlc\utils>test.btm 2+5*12
TPunct+TDigit: 6
theLen       : 6
2+5*12 contains only Numeric Digits and punctuation characters
This can be used as a math function
%@eval[%mycalc] = 62
Another example run;
Code:
c:\users\jlc\utils>test 2 + 5 * 12
TPunct+TDigit: 6
theLen       : 10
The %mycalc variable cannot be used as a math function

c:\users\jlc\utils>test "2 + 5 * 12"
TPunct+TDigit: 8
theLen       : 12
The %mycalc variable cannot be used as a math function
Joe
 

Charles Dye

Super Moderator
Staff member
May 20, 2008
3,794
48
Albuquerque, NM
prospero.unm.edu
How about expressions containing letters?
Code:
set r=4
echo %@eval[pi * r * r]
Muddying the waters even further, @EVAL happily accepts nonexistent variables; they evaluate to zero:
Code:
echo %@eval[Oliver Cromwell]
I think the only way to determine whether a string is valid input to @EVAL is to try passing it to @EVAL....
Code:
set ans=
( set ans=%@eval[%$] ) >& nul:
if defined ans ....
 
May 20, 2008
9,195
60
Syracuse, NY, USA
I think the only way to determine whether a string is valid input to @EVAL is to try passing it to @EVAL....
Only if you're OK with zero meaning invalid. Even utter garbage evaluates to 0.
Code:
v:\> set answer=%@eval[utter garbage]

v:\> set answer
0
I wonder if @EVAL even knows when it was given a non-expression. If it does, returning something appropriate, like "N/A", would be more useful than 0.
 

Charles Dye

Super Moderator
Staff member
May 20, 2008
3,794
48
Albuquerque, NM
prospero.unm.edu
So, just pass everything to Google; let Google decide whether it's a math expression or not!

I've been messing with @URLENCODE. This function is fun to use because it can return percent signs. Have to use SETDOS to disable nested variable expansion:

Code:
@echo off
::   Google.btm
setlocal
setdos /x-4
start https://www.google.com/search?q=%@urlencode[%$]
endlocal
 
Mar 6, 2019
10
0
Wow. thanks for all the replies. Some is more complex than i expected... funny i had given up and also came up with the idea of giving it all to google but it wouldnt' pass the url correctly when i did 2+2 i guess the plus is some type of hypertext code and was unaware of the urlencode feature. I'm going to read some of this a few times. Thank you all very much.
 
Mar 6, 2019
10
0
So it looks like i'm going with joe's method and using urlencode.. that should do it perfectly i think. Thanks !

EDIT: yep works beautifully! and i learned a few things. also added that google.btm to my btm dir and aliased it with the letter g.
 
Last edited:
May 20, 2008
9,195
60
Syracuse, NY, USA
No, zero is valid. The expression is invalid if @EVAL fails, i.e. the command is not executed.
Huh? In my example,
Code:
set answer=%@eval[utter garbage]
the SET command was executed. Does that mean @EVAL succeeded ... that the expression is valid?

It's hard to get @EVAL to fail ... overflow ... divide by zero ... and those can come from expressions which are actually valid.
 

Charles Dye

Super Moderator
Staff member
May 20, 2008
3,794
48
Albuquerque, NM
prospero.unm.edu
Huh? In my example,
Code:
set answer=%@eval[utter garbage]
the SET command was executed. Does that mean @EVAL succeeded ... that the expression is valid?
I think UTTER is valid (evaluates to 0, unless you set it to something else) and GARBAGE is ignored. It does the same with numbers:
Code:
C:\>echo %@eval[42 1000]
42

C:\>
But if it finds an operator, @EVAL will carry on:
Code:
C:\>set utter=6765

C:\>set garbage=4181

C:\>echo %@eval[utter / garbage]
1.6180339632

C:\>
 
May 20, 2008
9,195
60
Syracuse, NY, USA
I suppose for proper algebra-ness, adjacent numbers without an operator between them ought to be multiplied. But the parser for @EVAL must be a... challenging piece of code already.
I think that is only for single letter variable names (possibly with coefficients, subscripts, exponents). x = 2, y = 3, xy = 6, 4x = 8, 4xy = 24. I've never thought of two numbers separated by whitespace as indicating multiplication (or anything). And, of course, if you don't separate two numbers with something, you get either one number or garbage. For multiplication ...
Code:
(2)(3) = 2x3 = 2∙3 = 2 x 3 = 2 ∙ 3 = 6

but not 2 3 = 6 or even (2) (3) = 6