AndAlso

Previous topic - Next topic

bigsofty

The is a Freebasic command that is really for optimisation of IF statments. Instead of each expression being evaluated only the next one is evaluated if the previous one is true.

This can already be done using nested if statements but the AndAlso command, makes for a very clean and readable(in single line) IF/THEN statement and it makes for very efficient code when you dont need to evaluate extra conditions when one fails.


From the FB manual...
Code (glbasic) Select
If...Then Control flow statement for conditional branching


Syntax

If expression Then [statement(s)] [Else [statement(s)]] [End If]
or
If expression Then : [statement(s)] [Else [statement(s)]] : End If
or
If expression Then

[statement(s)]

[ ElseIf expression Then ]

[statement(s)]

[ Else ]

[statement(s)]

End If


Description

If...Then is a way to make decisions. It is a mechanism to execute code only if a condition is true, and can provide alternative code to execute based on more conditions.

expression can be one of several forms:

a conditional expression, for example:

x = 5

multiple conditions separated by logical bit-wise operators, for example:

x >= 5 And x <= 10

multiple conditions separated by logical short-circuit operators, for example:

y <> 0 AndAlso x \ y = 1
(in this case, "x \ y = 1" will only be evaluated if "y <> 0" is True)

any numerical expression, in which case a value of zero (0) represents False, and a non-zero value represents True


Both multi-line and single-line Ifs can be nested. In the latter case, the optional End Ifs can be useful to control where nested Ifs begin and end.

In the -lang fb and -lang fblite dialects, colons (:) can be used instead of newlines to construct multi-line If blocks on a single line.


Example


'' Here is a simple "guess the number" game using if...then for a decision.

Dim As Integer num, guess

Randomize
num = Int(Rnd * 10) + 1 'Create a random number between 1 and 10...
               
Print "guess the number between 1 and 10"

Do 'Start a loop

    Input "Guess"; guess 'Input a number from the user

    If guess > 10 OrElse guess < 1 Then  'The user's guess is out of range
        Print "The number can't be greater then 10 or less than 1!"
    ElseIf guess > num Then  'The user's guess is too low
        Print "Too low"
    ElseIf guess < num Then  'The user's guess is too high
        Print "Too high"
    ElseIf guess = num Then  'The user guessed the right number!
        Print "Correct!"
        Exit Do   'Exit the loop
    End If

Loop 'Go back to the start of the loop




Dialect Differences

In the -lang fb and -lang fblite dialects, if there is a new line, a single-line comment ('), a colon (:), or a Rem statement directly after THEN, then the IF will be multi-line. Any other statement will result in a single-line IF.
In the -lang qb dialect, if there is a new line or a single-line comment (') directly after THEN, then the IF will be multi-line. A colon, a Rem or any other statement will result in a single-line IF.


Differences from QB


END IF was not supported in single-line IFs in QBASIC.
Cheers,

Ian.

"It is practically impossible to teach good programming style to students that have had prior exposure to BASIC.  As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)

spicypixel

Could you not use SELECT and CASE to determine which IF expressions to evaluate?
http://www.spicypixel.net | http://www.facebook.com/SpicyPixel.NET

Comps Owned - ZX.81, ZX.48K, ZX.128K+2, Vic20, C64, Atari-ST, A500.600.1200, PC, Apple Mini-Mac.

bigsofty

#2
No I don't think so, that's not its purpose, SELECT/CASE is for a different situation, that is, executing a specific piece of code that matches a specific expression. AndAlso, is the same as AND, except in certain situation its more efficient. As I said, it can be recreated with nested ifs but its not as efficient or as neat.

Code (glbasic) Select
IF Check1(x1) ANDALSO Check1(x2) ANDALSO Check1(x3) ANDALSO x1 > 0 ANDALSO x1 <=10 THEN Blah=0
One way to achieve this is...

Code (glbasic) Select
IF Check1(x1)
  IF Check1(x2)
    IF Check1(x3)
      IF x1 > 0
         IF x1 <= 10
           blah=0
         ENDIF
      ENDIF
    ENDIF
  ENDIF
ENDIF


The optimisation feature here is that the function "Check1()" may need only be called once if it fails early or that any failed expression can break out before the rest of the IFs expressions are evaluated. A lot less code may be executed when compared to a traditional IF/AND/THEN.

Cheers,

Ian.

"It is practically impossible to teach good programming style to students that have had prior exposure to BASIC.  As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)

erico

would be nice, my codes have a few of those nested ifs

spicypixel

Quote from: Ocean on 2012-Jan-08
what's wrong with:

Code (glbasic) Select
IF   (  Check1(x1) AND Check1(x2) AND Check1(x3) AND x1 > 0 AND x1 <=10  )    THEN Blah=0
?

cheers
Ocean

I was gonna post whats wrong with using AND but thought I must have stupidly missed something :D
http://www.spicypixel.net | http://www.facebook.com/SpicyPixel.NET

Comps Owned - ZX.81, ZX.48K, ZX.128K+2, Vic20, C64, Atari-ST, A500.600.1200, PC, Apple Mini-Mac.

Ruidesco

#5
What Bigsofty means is that using ANDs the whole chain of equations has to be evaluated no matter their individual results, while with ANDALSOs the chain evaluation is aborted when one of the equations turns to be false, thus saving some process time; that is why the concatenation of ANDALSOs works like nestled IFs, but is cleaner when it comes to code formatting.

bigsofty

#6
The problem with AND is that it's a logical operator, there may an occasion that using a logic calculation is required, part of an algorithm for example(even within an IF). As such the compiler does not always know what or when to cut out.

AndAlso is not the same as AND it more closely to nested IFs, one way that may operate GLB in a similar manner is...

IF a=b THEN IF c=d THEN IF e=f THEN x=0

Although that's a bit messy and I'm not sure it would work.

It's quite a popular command, used in VB,C#, Freebasic etc... Here's the VB manual entry for it for example, http://msdn.microsoft.com/en-us/library/cb8x3kfz(v=vs.80).aspx

Cheers,

Ian.

"It is practically impossible to teach good programming style to students that have had prior exposure to BASIC.  As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)

Kitty Hello

Nohoooo!

See this examle:

Code (glbasic) Select


DEBUG "with AND\n"
IF ok() AND ok() THEN PRINT 0,0,0
DEBUG "now with OR\n"
IF ok() OR ok() THEN PRINT 0,0,0
DEBUG "not ok with AND\n"
IF notok() AND ok() THEN PRINT 0,0,0

FUNCTION ok:
    DEBUG "Call to ok()\n"
    RETURN TRUE
ENDFUNCTION

FUNCTION notok:
    DEBUG "Call to notok()\n"
    RETURN FALSE
ENDFUNCTION


you will notice, there's only one call to "ok()" for the OR operator, because if the first condition is true, the 2nd condition does not matter anymore and won't be evaluated.
Same for the last line, where "notok()" already returns false and the ok() won't be called.
AND and OR are evaluated left to right.


kanonet

Thanks Kitty, didnt know that, now i can reorganise some code.
Could you plz, mention that in the help file, cuz its an nice feature, but not the expected behaviour.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

bigsofty

Well this is a pleasant surprise, thanks for clearing that up Gernot.  :good:

BTW is this a GCC or GLB optimisation?
Cheers,

Ian.

"It is practically impossible to teach good programming style to students that have had prior exposure to BASIC.  As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)

Crivens

That's what I expected to be honest. It's what the ancient language I use at work does, although admittedly I've seen languages that process every single part of an OR.

Cheers
Current fave quote: Cause you like musicians and I like people with boobs.

Kitty Hello

that's the way the C/C++ code generated works.

bigsofty

Really surprised here, the andalso command is still being actively introduced to new languages. You've got to ask yourself the question why, when old languages have features that remove the need to have them at all? Anders Hejlsberg designed C# and Delphi, he is at the top of my personsallist of coding geniuses, again though, why does a smart guy introduce a defunct command into C#, that is not really needed? Weird.

Anyways, I digress, again, thanks for clearing that up Gernot.  :good:
Cheers,

Ian.

"It is practically impossible to teach good programming style to students that have had prior exposure to BASIC.  As potential programmers, they are mentally mutilated beyond hope of regeneration."
(E. W. Dijkstra)

Crivens

Three reasons. Either we aren't 100% understanding what this new command does, they don't understand what the old commands do in the majority of languages, or they are doing it to make things more readable and therefore less complex for the general programmer.

Talking about readable, did anyone ever use Hypercard on the old Macs? I did my whole 3rd year BSc project in it and was the most amazingly readable language I've ever seen. You could even have spaces in variables. Sometimes when trying to work things out you could get away with typing what you wanted to do as you would say it in English and it would work. Brilliant. Probably rose tinted spectacles there. It was 20 years ago almost and I was always very very drunk etc...

Cheers
Current fave quote: Cause you like musicians and I like people with boobs.