REBOL 3 Docs Guide Concepts Functions Datatypes Errors
  TOC < Back Next >   Updated: 19-Aug-2010 Edit History  

REBOL 3 Functions: if

if  condition  then-block  /else  else-block

If condition is TRUE, evaluates the block.

Arguments:

condition

then-block [block!]

Refinements:

/else - If not true, evaluate this block

else-block [block!]

See also:

either   any   all   unless   switch   select  

Description

The if function will evaluate the block when its first argument is true.

True is defined to be any value that is not false or none.

if 2 > 1 [print "that's true"]
that's true

The condition can be the result of several expressions within any or and, or any other function that produces a result:

if all [
    time > 10:20
    age > 20
    find users "bob"
] [print "that's true"]
that's true

In addition, it can be pointed out that the block can be in a variable also:

blk: [print "that's true"]
if 2 > 1 blk
that's true

Return Value

When the condition is true, the if function returns the value that is the result of evaluating the block. Otherwise, it returns none. This is a useful feature.

For example:

print if 2 > 1 [1 + 2]
3
print if 1 > 2 [1 + 2]
none
names: ["Carl" "Brian" "Steve"]
print if find names "Carl" ["Person found"]
Person found

Where's the Else?

Unlike most other languages, REBOL uses functions, not commands to evaluate all expressions. Therefore, it's not desirable to use the word else if you need that behavior. Instead, use the either function:

either 2 > 1 [print "greater"] [print "not greater"]
greater
either 1 > 2 [print "greater"] [print "not greater"]
not greater

Simplification

The above example is pretty common, but it should be noted that it can be easily refactored:

either 2 > 1 [print "greater"] [print "not greater"]

is better written as:

print either 2 > 1 ["greater"] ["not greater"]

or even better written as:

print pick ["greater" "not greater"] 2 > 1

The importance of this is that you're picking from a choice of two strings, and you're doing it here with one less block than the code above it.

Be careful with this last method. The pick function only allows true and false, not none. See either for more details.

In addition, it should be noted that the any function used earlier didn't really require the if at all. It could have been written as:

all [
    time > 10:20
    age > 20
    find users "bob"
    print "that's true"
]

A Common Error

A common error is to use if and add an "else" block without using the either function. The extra block gets ignored:

n: 0
if 1 > 2 [n: 1] [n: 2]
print n
0

The second block is ignored in this case and not evaluated.

The code should have used the either function:

n: 0
either 1 > 2 [n: 1] [n: 2]
print n
2

The /Else refinement is obsolete

The /Else refinement is obsolete and will be removed in future versions. Avoid it.


  TOC < Back Next > REBOL.com - WIP Wiki Feedback Admin