[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: inconsistencies between arithmetic and boolean operators
- From: Adrien de Croy <adrien@...>
- Date: Fri, 10 Aug 2007 19:38:19 +1200
actually you'd need to put STRING below NUMBER, else
1 > "Fish"
if we converted the rhs to a number would return true, as "Fish" would
convert to 0. whereas
1 > "Fish"
if we converted the lhs to a string would return false on the string
compare since "1" < "Fish" using lstrcmp.
In the end, probably best to just convert anything to a string if they
aren't the same type then do the comparison.
e.g.
int lua_CheckTypes(lua_State* L, TValue *lhs, TValue *rhs)
{
int nLhsType = ttype(lhs);
int nRhsType = ttype(rhs);
const TValue* tmL;
const TValue* tmR;
if(nLhsType == nRhsType)
return 1;
// just do all comparisons as string.
return (tostring(L, lhs) && tostring(L, rhs));
}
then in code where we call
if(ttype(lhs) == ttype(rhs))
we replace that with
if(lua_CheckTypes(L, lhs, rhs))
Adrien
Adrien de Croy wrote:
As work on __cast progresses, I've come across an issue relating to
boolean operators.
Arithmetic operators attempt to convert both operands to a number
first, so they work fine with __cast.
boolean operators insist however that the 2 operands have the same
type, else the result is zero. This is checked first.
This means that the following code
var1 = "3";
var2 = var1 * 2;
is valid and var2 will have the numeric value of 6
however
var1 = "3"
if(var1 < 4) then
...
is invalid, since var1 and 4 have different types, the result is an
error. If you wanted this to "work" you'd need to write
var1 = "3"
if((var1 * 1) < 4) then
...
the multiplication converts var1 in-place to a number.
Shouldn't the boolean operators try and do something like this?
e.g. instead of simply returning false on a type mismatch, try (e.g.
by __cast metamethod) to demote the higher type to the lower type,
where the precedence of types is (in descending order)
TABLE
USERVALUE
STRING
NUMBER
BOOLEAN
Adrien
--
Adrien de Croy - WinGate Proxy Server - http://www.wingate.com