Many of the language constructs discussed in this section evaluate an expression, then perform an action based on whether the expression is true or false, such as with the IF statement:

IF expression THEN statement

For example, we would say “If X equals 1, then set Y equal to 2” as follows:

IF (X EQ 1) THEN Y = 2

But what if we want to do more than one thing if X equals 1? For example, “If X equals 1, set Y equal to 2 and print the value of Y.” If we wrote it as follows, then the PRINT statement would always be executed, not just when X equals 1:

IF (X EQ 1) THEN Y = 2 
PRINT, Y

IDL provides a container into which you can put multiple statements that are the subject of a conditional or repetitive statement. This container is called a BEGIN...END block, or compoundstatement. A compound statement is treated as a single statement and can be used anywhere a single statement can appear.

BEGIN...END


The BEGIN...END statement is used to create a block of statements, which is a group of statements that are treated as a single statement. Blocks are necessary when more than one statement is the subject of a conditional or repetitive statement.

For example, the above code could be written as follows:

IF (X EQ 1) THEN BEGIN
   Y = 2
   PRINT, Y
END

All the statements between the BEGIN and the END are the subject of the IF statement. The group of statements is executed as a single statement. Syntactically, a block of statements is composed of one or more statements of any type, started by BEGIN and ended by an END identifier. To be syntactically correct, we should have ended our block with ENDIF rather than just END:

IF (X EQ 1) THEN BEGIN
   Y = 2
   PRINT, Y
ENDIF

This is to ensure proper nesting of blocks. The END identifier used to terminate the block should correspond to the type of statement in which BEGIN is used. The following table lists the correct END identifiers to use with each type of statement.

Statement

END
Identifier

Example

ELSE BEGIN

ENDELSE

IF (0) THEN A=1 ELSE BEGIN
   A=2
ENDELSE

FOR variable=init, limit DO BEGIN

ENDFOR

FOR i=1,5 DO BEGIN
   PRINT, array[i]
ENDFOR

IF expression THEN BEGIN

ENDIF

IF (0) THEN BEGIN
   A=1
ENDIF

REPEAT BEGIN

ENDREP

REPEAT BEGIN
   A = A * 2
ENDREP UNTIL A GT B

WHILE expression DO BEGIN

ENDWHILE

WHILE ~ EOF(1) DO BEGIN
   READF, 1, A, B, C
ENDWHILE

LABEL: BEGIN

END

LABEL1: BEGIN
   PRINT, A
END

case_expression: BEGIN

END

CASE name OF
'Moe': BEGIN
         PRINT, 'Stooge'
       END
ENDCASE

switch_expression: BEGIN

END

SWITCH name OF
'Moe': BEGIN
         PRINT, 'Stooge'
       END
ENDSWITCH

Note: CASE and SWITCH also have their own END identifiers. CASE should always be ended with ENDCASE, and SWITCH should always be ended with ENDSWITCH.

The IDL compiler checks the end of each block, comparing it with the type of the enclosing statement. Any block can be terminated by the generic END, but no type checking is performed. Using the correct type of END identifier for each block makes it easier to find blocks that you have not properly terminated.

Listings produced by the IDL compiler indent each block four spaces to the right of the previous level to make the program structure easier to read. (See .RUN for details on producing program listings with the IDL compiler.)