Introduces a block-if control structure.

### No options

### Parameter

expression |
Logical expression, indicating whether or not to execute the first set of statements. |
---|

### Description

A *block-if* structure consists of one or more alternative sets of statements. The first of these is introduced by an `IF`

statement. There may then be further sets introduced by `ELSIF`

statements. Then you can have a final set introduced by an `ELSE`

statement, and the whole structure is terminated by an `ENDIF`

statement. Thus the general form is:

first

`IF`

expression

statements

then either none, one, or several blocks of statements of the form

`ELSIF`

expression

statements

then, if required, a block of the form

`ELSE`

statements

and finally the statement

`ENDIF`

Each expression must evaluate to a single number, which is treated as a logical value: a zero value is treated as *false* and non-zero as *true*. Genstat executes the block of statements following the first true expression. If none of the expressions is *true*, the block of statements following `ELSE`

(if present) is executed.

You can thus use these directives to built constructs of increasing complexity. The simplest form would be to have just an `IF`

statement, then some statements to execute, and then an `ENDIF`

. For example:

`IF MINIMUM(Sales) < 0`

` PRINT 'Incorrect value recorded for Sales.'`

`ENDIF`

If the variate `Sales`

contains a negative value, the `PRINT`

statement will be executed. Otherwise Genstat goes straight to the statement after `ENDIF`

.

To specify two alternative sets of statements, you can include an `ELSE`

block. For example

`IF Age < 20`

` CALCULATE Pay = Hours*1.75`

`ELSE`

` CALCULATE Pay = Hours*2.5`

`ENDIF`

calculates `Pay`

using two different rates: 1.75 for `Age`

less than 20, and 2.5 otherwise.

Finally, to have several alternative sets, you can include further sets introduced by `ELSIF`

statements. Suppose that we want to assign values to `X`

according to the rules:

`X`

=1 if `Y`

=1

`X`

=2 if `Y`

≠ 1 and `Z`

=1

`X`

=3 if `Y`

≠ 1 and `Z`

=2

`X`

=4 if `Y`

≠ 1 and `Z`

≠ 1 or 2

This can be written in Genstat as follows:

`IF Y == 1`

` CALCULATE X = 1`

`ELSIF Z == 1`

` CALCULATE X = 2`

`ELSIF Z == 2`

` CALCULATE X = 3`

`ELSE`

` CALCULATE X = 4`

`ENDIF`

If `Y`

is equal to 1, the first `CALCULATE`

statement is executed to set `X`

to 1. If `Y`

is not equal to 1, Genstat does the tests in the `ELSIF`

statements, in turn, until it finds a *true* condition; if none of the conditions is *true*, the `CALCULATE`

statement after `ELSE`

is executed to set `X`

to 4. Thus, for `Y`

=99 and `Z`

=1, Genstat will find that the condition in the `IF`

statement is *false*. It will then test the condition in the first `ELSIF`

statement; this produces a *true* result, so `X`

is set to 2. Genstat then continues with whatever statement follows the `ENDIF`

statement. Block-if structures can be nested to any depth, to give conditional constructs of even greater flexibility.

Options: none.

Parameter: unnamed.

### See also

Directives: `ELSIF`

, `ELSE`

, `ENDIF`

, `EXIT`

, `CASE`

, `CALCULATE`

.

Commands for: Program control.

### Example

" Example 1:5.3.2. 1:5.4.4 " PROCEDURE '%TRANSFORM' " Define the arguments of the procedure." OPTION NAME='METHOD'; MODE=t;\ VALUES=!t(Logit,Comploglog,Angular);\ DEFAULT='LOGIT' PARAMETER NAME='PERCENT','RESULT';\ MODE=p; SET=yes; DECLARED=yes,no;\ TYPE=!t(scalar,variate,matrix,symmetric,diagonal,table);\ COMPATIBLE=*,!t(type,nvalues);\ PRESENT=yes,no IF METHOD .EQS. 'Logit' CALCULATE RESULT = LOG( PERCENT / (100-PERCENT) ) ELSIF METHOD .EQS. 'Comploglog' CALCULATE RESULT = LOG( -LOG((100-PERCENT)/100) ) ELSIF METHOD .EQS. 'Angular' CALCULATE RESULT = ANGULAR(PERCENT) ENDIF ENDPROCEDURE VARIATE [VALUES=10,20...90] Every10% " default setting 'logit' for METHOD " %TRANSFORM Every10%; RESULT=Logit10% PRINT Every10%,Logit10%; DECIMALS=0,3 %TRANSFORM [METHOD=A] 25,50,75; RESULT=Ang25,Ang50,Ang75 PRINT Ang25,Ang50,Ang75 COMMANDINFORMATION '%TRANSFORM','CAPTION','DOTPLOT','NOTONE';\ IMPLEMENTATION=tranimp,capimp,dotimp,notimp;\ CHANNEL=tranchan,capchan,dotchan,notchan;\ PRESENT=trancheck,capcheck,dotcheck,notcheck PRINT tranimp,tranchan,trancheck & capimp,capchan,capcheck & dotimp,dotchan,dotcheck & notimp,notchan,notchec