while it can be done to some extent with macro's the cost of the procedure call is a bit of a performance hit
and would be really nice to have in native code for convince.
see http://www.purebasic.fr/english/viewtop ... 12&t=39843
Code: Select all
Procedure.s IIFEvals(expr,*y,*n)
If expr
ProcedureReturn PeekS(*y)
Else
ProcedureReturn PeekS(*n)
EndIf
EndProcedure
Procedure IIFEvali(expr,y,n)
If expr
ProcedureReturn y
Else
ProcedureReturn n
EndIf
EndProcedure
Procedure.f IIFEvalf(expr,y.f,n.f)
If expr
ProcedureReturn y
Else
ProcedureReturn n
EndIf
EndProcedure
Procedure.d IIFEvald(expr,y.d,n.d)
If expr
ProcedureReturn y
Else
ProcedureReturn n
EndIf
EndProcedure
Procedure IIFEvalq(expr,y.q,n.q)
If expr
ProcedureReturn y
Else
ProcedureReturn n
EndIf
EndProcedure
Macro IIFI(expr,y,n)
IIFEvali((Not(expr)),n,y)
EndMacro
Macro IIFF(expr,y,n)
IIFEvalf((Not(expr)),n,y)
EndMacro
Macro IIFD(expr,y,n)
IIFEvald((Not(expr)),n,y)
EndMacro
Macro IIFQ(expr,y,n)
IIFEvalf((Not(expr)),n,y)
EndMacro
Macro IIFS(expr,y,n)
IIFEvals((Not(expr)),n,y)
EndMacro
Macro IIFfn(expr,a,b)
If expr : a : Else : b : EndIf
EndMacro
Procedure p2(a.s)
MessageRequester("test",a)
EndProcedure
a=5
b=4
c=2
d=3
e.f = 5.6
f.f = 5.5
IIFfn(5>4,p2("hello"),MessageRequester("test","no"))
Debug IIFS(5.3>5.4,@"yes",@"no")
Debug IIFI(a > b,200,100)
Debug IIFF(e > f,200.1234567,100.1234567)
Debug IIFD(5.5 = 5.6,200.123456789012345,10.123456789012345)
Debug IIFQ(a > c,$FFFFFFFF,$EEEEEEEE)
lp = 100000000
st = GetTickCount_()
For a = 1 To lp
x = IIFi(5.5 > 7.5,200,100)
Next
et1.f = (GetTickCount_() - st) / lp
st = GetTickCount_()
For a = 1 To lp
If 5.5 > 7.5
x = 200
Else
x = 100
EndIf
Next
et2.f = (GetTickCount_() - st) / lp
MessageRequester("test", "IIFs " + StrF(et1,6) + " if " + StrF(et2,6))