If ... Then func() Else ...

Blitz3D Forums/Blitz3D Bug Reports/If ... Then func() Else ...

Here's a fun one for the BRL team! :D

If blah Then Print Else foo() ; fine, as expected
If blah Then foo() Else Print ; SYNTAX ERROR: Expecting expression?!

Function foo()
End Function


I can't believe I haven't run into this until now!

I have noticed something similar, but have not tried to pin it down yet. Next time I come across it I will post some code, but it usually results in me having to split the if.then.else statement into multiple lines with if...else...endif.

Here is an example taken directly from the code of my current game:

this code works:
If OtherUnit\IsPlayer Then 
AddSoundToPlayList(OtherUnit.UnitObject,"body impact")
Else
 AddSoundToPlayList(OtherUnit.UnitObject,"impact")
endIf 

this code does not:
If OtherUnit\IsPlayer Then AddSoundToPlayList(OtherUnit.UnitObject,"body impact") Else AddSoundToPlayList(OtherUnit.UnitObject,"impact")


does it in both blitzplus and blitz3d (haven't tried it in blitzbasic but probably not much point testing that one..)

I've simplified your test case. Your code is causing a problem because you're calling a function with two arguments.

If blah Then bar() Else Print ; Expecting Expression
If blah Then bar(1) Else Print ; works fine!
If blah Then bar(1,2) Else Print ; Expecting ')'
If blah Then bar(1,2,3) Else Print ; Expecting ')'
If blah Then bar(1,2,3,4) Else Print ; Expecting ')'
If blah Then bar(1,2,3,4,5) Else Print ; Expecting ')'

Function bar(x1=0,x2=0,x3=0,x4=0,x5=0)
End Function


As illustrated above, the Blitz3d parser chokes on single-line IF..THEN..ELSE statements where the THEN substatement is a function call with (a) any number of parameters other than one and (b) an ignored return value.

Weird. Is this a problem specific to the 1.93 update? I probably haven't hit it before because I hardly ever use If/Then/Else on a single line.

I think it's an old problem. I remember having the same problem long ago when I tried:

If blah Then Color(255, 255, 255) Else Color(0, 0, 0)


I know 1.91 also suffers from this issue because I upgraded from that to see if it'd go away.

Regardless of whether it's an old problem this parser bug should be fixed. :)

If you have a function that doesn't return a value, then you can call it by taking out the brackets. I know some people prefer to use the brackets all the time, but I prefer to have these sort of functions 'look' like any other command.

So...
If a=10 Then Color(255,255,255) Else Color(200,200,200)
produces the error, but
If a=10 Then Color 255,255,255 Else Color 200,200,200
does not.

Nice catch.

Personally, I use parenthesis even with builtin commands.

To be on the save side you may use the dedicated command delimiters:
if condition: action():else:actions2():endif
The structure is about the same.