[Gambas-user] Removing / Modifying IsXXXX() functions in Gambas3

Benoît Minisini gambas at ...1...
Wed Nov 24 12:28:00 CET 2010


> On 24-11-2010 12:08, Benoît Minisini wrote:
> > Hi,
> > 
> > I'm currently thinking about modifying/removing all IsXXXX() functions in
> > Gambas 3.
> > 
> > They mainly test the datatype of their expression. So, either the
> > datatype is known at compile time, and there should be no need of
> > testing it ; either you are using a Variant, and you can use TypeOf() to
> > get the datatype of the value.
> > 
> > I will replace them by some functions that will test if a value can be
> > converted safely from a string by using localization. This is what most
> > users expected from these functions.
> > 
> > For exemple, in french localization:
> > 	IsDate("13/2/20") ->  True
> > 	IsNumber("3,34") ->  True
> > 	IsInteger("3,34") ->  False
> > 	IsNumber("3.34") ->  False
> > 
> > Internally, they will use Val() and see if the conversion works.
> > 
> > I will kept most of the name, so there will be a big incompatibility
> > between Gambas 2, current Gambas 3, and final Gambas 3.
> > 
> > What do you think about that?
> > 
> > Who is using the IsXXXX() functions, and in which context?
> 
> I use these in my project, a lot less than expected at first:
> 
> Bluetooth.module:        IF IsInteger(Val(sRSSI)) THEN
> Bluetooth.module:          iRSSI = IsInteger(Val(sRSSI))
> Events.module:      IF rResult!rerunenabled = TRUE AND IF
> IsDate(rResult!lastrun) THEN
> Events.module:  IF IsBoolean(sValue) THEN sValue = Main.DisplayBool(sValue)
> Events.module:  IF IsBoolean(sCond) THEN sCond = Main.DisplayBool(sCond)
> Events.module:  ELSE IF IsBoolean(vResult) THEN
> JSON.module:  IF NOT IsLetter(sCar) THEN RETURN sCar
> JSON.module:    IF NOT IsLetter(sCar) THEN
> JSON.module:  IF IsNull(vNumber) THEN Error.Raise("Incorrect number")
> JSON.module:  ELSE IF sCar = "-" OR IF IsDigit(sCar) THEN
> Mail.module:    IF IsString(Main.GlobalVar["Minute"]) THEN
> Main.GlobalVar["Minute"] = Val(Main.GlobalVar["Minute"])
> Main.module:  IF NOT IsNull(vValue) THEN
> Main.module:    IF IsNumber(Val(tv[k, col].Text)) THEN
> Main.module:    IF IsNumber(Val(gv[k, col].Text)) THEN
> Main.module:PUBLIC FUNCTION IsTime(sString AS String) AS Boolean
> Main.module:PUBLIC FUNCTION IsBool(sStr AS String) AS Boolean
> CDenon.class:      IF IsInteger(sValue) THEN
> CDenon.class:      IF IsInteger(sValue) THEN
> CDenon.class:      IF IsNull(Val(sZonecat)) THEN
> CRFXComRX.class:    IF IsDigit(Hex(RecBuf[4])) AND IF
> IsDigit(Hex(Lsr(RecBuf[3], 4))) THEN
> CSqueezeServer.class:    ELSE IF IsLetter(sCar) OR IF IsDigit(sCar) OR
> IF InStr("*-._", sCar) THEN
> FConditionEditor.class:  IF NOT
> (Main.IsBool(Events.EvalFormula(taFormula.Text))) THEN
> FConditionEditor.class:      IF IsBoolean(vVal) THEN
> FDebug.class:    IF IsBoolean(vValue) THEN
> FTriggerEditor.class:    IF IsBoolean(Main.GlobalVar[cmbVariables.Text])
> THEN
> FTriggerEditor.class:    ELSE IF NOT
> IsNumber(Main.GlobalVar[cmbVariables.Text]) THEN
> FTriggerEditor.class:    IF IsNumber(Val(txtDeviceValue.Text)) THEN
> 
> Regards,
> Ron_2nd.
> 

When you do IsNumber(Val(...)), you actually want the new behaviour I want to 
implement: checking if a string can be safely converted to what you want. In 
the new syntax, you will directly do IsNumber(...).

The IsDigit(), IsLetter()... functions are not concerned by the change.

IsNull() will be kept unchanged.

Then, please tell me what you are testing exactly with these lines:

Events.module:      IF rResult!rerunenabled = TRUE AND IF 
IsDate(rResult!lastrun) THEN
Events.module:  IF IsBoolean(sValue) THEN sValue = Main.DisplayBool(sValue)
Events.module:  IF IsBoolean(sCond) THEN sCond = Main.DisplayBool(sCond)
Events.module:  ELSE IF IsBoolean(vResult) THEN
Mail.module:    IF IsString(Main.GlobalVar["Minute"]) THEN
Main.GlobalVar["Minute"] = Val(Main.GlobalVar["Minute"])
CDenon.class:      IF IsInteger(sValue) THEN
CDenon.class:      IF IsInteger(sValue) THEN
FConditionEditor.class:      IF IsBoolean(vVal) THEN
FDebug.class:    IF IsBoolean(vValue) THEN
FTriggerEditor.class:    IF IsBoolean(Main.GlobalVar[cmbVariables.Text])
THEN
FTriggerEditor.class:    ELSE IF NOT
IsNumber(Main.GlobalVar[cmbVariables.Text]) THEN

Thanks in advance.

-- 
Benoît Minisini




More information about the User mailing list