Function IIF( theCond, theTrue, theFalse )
Dim theResult
If theCond Then
theResult = theTrue
Else
theResult = theFalse
End If
IIF = theResult
End Function
So I tried delaying evaluation:
Function EIF( theValue, theTest, theTrue, theFalse )
Dim theResult
Dim theBool
theTest = Replace( theTest, "$1", "theValue" )
theTrue = Replace( theTrue, "$1", "theValue" )
theFalse = Replace( theFalse, "$1", "theValue"
)
theBool = Eval( theTest )
If theBool = True Then
theResult = Eval( theTrue )
Else
theResult = Eval( theFalse )
End If
EIF = theResult
End Function
Calling it was to work like this,
i = 1
j = EIF(i,"$1=1","$1", "$1*$1")
That is, if i = 1 then j = i else j = i * i. If I'd just used IIF it would have been
i = 1
j = IIF(i=1,i,i*i)
and the true and false parts would have been evaluated
before invocation of the IIF function.I gave up in the end, but it was fun ... sort of.
What's wrong with
ReplyDeleteFunction IIF(c, t, f)
Dim ret
If c Then
ret = Eval(t)
Else
ret = Eval(f)
End
IIF = ret
End Function
j = IIF(i=1, "i", "i*i")
That seems to be what you're looking for — the lazy evaluation of t and f, not lazy evaluation of c!
D'oh!
ReplyDeleteThis is part of the reason I got this blog off the ground ... I need the odd reality check which your comment graciously provides. Thanks!
--Bruce.