Control Structures: Difference between revisions

From NARS2000
Jump to navigationJump to search
No edit summary
No edit summary
Line 1: Line 1:
== Overview ==
<table border="1" cellpadding="5" cellspacing="0" rules="none" summary="">
<table border="1" cellpadding="5" cellspacing="0" rules="none" summary="">
<tr>
<tr>
Line 92: Line 94:
<apll>:endfor</apll>
<apll>:endfor</apll>


This statement evaluates <i>expr</i> once, loops through its elements, assigns each successive value to <i>varname</i>, and then executes the statements between <apll>:for</apll> and <apll>:endfor</apll> once for each value in <i>expr</i>.  The <i>expr</i> may be of any type (including character and nested), any rank, and any shape.  If <i>expr</i> is empty, the block of statements is skipped.
This statement evaluates <i>expr</i> once, loops through its elements, assigns each successive value to <i>varname</i>, and then executes the block of statements once for each value in <i>expr</i>.  The <i>expr</i> may be of any type (including character and nested), any rank, and any shape.  If <i>expr</i> is empty, the block of statements is skipped.


The <i>varname</i> is not localized to the <apll>:for</apll> loop; upon exiting the loop, <i>varname</i> has the last value assigned to it by the <apll>:for</apll> loop.
The <i>varname</i> is not localized to the <apll>:for</apll> loop; upon exiting the loop, <i>varname</i> has the last value assigned to it by the <apll>:for</apll> loop.


To interrupt the flow of control within the block of statements, use the <apll>:continue</apll> or <apll>:leave</apll> keywords.  The former keyword transfers control to the end of the block continuing with the next iteration, skipping the statements between the <apll>:continue</apll> and <apll>:endfor</apll> keywords.  The latter keyword exits the <apll>:for</apll> loop entirely and transfers control to the statement after the <apll>:endfor</apll> statement.  Typically, these two keywords appear within <apll>:if</apll> statements.
To interrupt the flow of control within a block of statements, use the <apll>:continue</apll> or <apll>:leave</apll> keywords.  The former keyword transfers control to the end of the block continuing with the next iteration, skipping the statements between the <apll>:continue</apll> and matching <apll>:endfor</apll> keywords.  The latter keyword exits the <apll>:for</apll> loop entirely and transfers control to the statement after the matching <apll>:endfor</apll> statement.  Typically, these two keywords appear within <apll>:if</apll> statements.


== GOTO Statement ==
== GOTO Statement ==
Line 105: Line 107:


== IF Statement ==
== IF Statement ==
<apll>:if <i>expr1</i></apll><br />
... (Block of statements)<br />
<apll>:elseif <i>expr2</i></apll><br />
... (Block of statements)<br />
<apll>:else</apll><br />
... (Block of statements)<br />
<apll>:endif</apll>
This statement conditionally executes a block of statements.
Each expression must evaluate to a Boolean-valued scalar or one-element vector.
Each <apll>:if</apll> and <apll>:elseif</apll> statement may be followed by zero or more statements which form the block of statements controlled by that statement.
The <apll>:if</apll> statement may be followed by zero or more <apll>:elseif</apll> blocks.  Optionally, the <apll>:else</apll> statement may appear after all <apll>:elseif</apll> statements to handle the case where none of the previous expressions was true (evaluated to a <apll>1</apll>).
Each <apll>:if</apll> and <apll>:elseif</apll> statement may be followed by zero or more <apll>:andif</apll> statements to narrow the conditions under which the following block of statements is executed, or may be followed by zero or more <apll>:orif</apll> statements to widen the conditions under which the following block of statements is executed.  The <apll>:andif</apll> and <apll>:orif</apll> statements may not be mixed within any <apll>:if</apll> or <apll>:elseif</apll> statement.


== REPEAT Statement ==
== REPEAT Statement ==
<table border="0" cellpadding="5" cellspacing="0" rules="none" summary="">
<tr>
  <td><apll>:repeat</apll></td>
  <td></td>
  <td></td>
  <td><apll>:repeat</apll></td>
</tr>
<tr>
  <td>... (Block of statements)</td>
  <td></td>
  <td></td>
  <td>... (Block of statements)</td>
</tr>
<tr>
  <td><apll>:endrepeat</apll></td>
  <td></td>
  <td></td>
  <td><apll>:until <i>expr</i></apll></td>
</tr>
</table>
This statement executes a block of statements repeatedly (but at least once) until the <apll>:until</apll> expression is true, or control transfers out of the Control Structure.
In the righthand form above, the block of statements is executed and then the expression is executed.  It must evaluate to a Boolean-valued scalar or one-element vector.  If the expression is true, the Control Structure terminates and execution continues with the statement after the <apll>:until</apll> statement; if the expression is false, execution continues at the start of the Control Structure.
The <apll>:until</apll> statement may be followed by zero or more <apll>:andif</apll> statements to widen the conditions under which the block of statements is executed, or it may be followed by zero or more <apll>:orif</apll> statements to narrow the conditions under which the block of statements is executed.  The <apll>:andif</apll> and <apll>:orif</apll> statements may not be mixed after an <apll>:until</apll> statement.
To interrupt the flow of control within a block of statements, use the <apll>:continue</apll> or <apll>:leave</apll> keywords.  The former keyword transfers control to the end of the block continuing with the next repetition, skipping the statements between the <apll>:continue</apll> and matching <apll>:endrepeat</apll> or <apll>:until</apll> keywords.  The latter keyword exits the <apll>:repeat</apll> loop entirely and transfers control to the statement after the matching <apll>:endrepeat</apll> or <apll>:until</apll> statement.  Typically, these two keywords appear within <apll>:if</apll> statements.


== RETURN Statement ==
== RETURN Statement ==
Line 135: Line 186:
When the last statement in a block of statements is executed, the system exits the <apll>:select</apll control structure.  The <apll>:leave</apll> statement may be used to exit that block before reaching the last statement, similar to the C language <b>break</b> statement.
When the last statement in a block of statements is executed, the system exits the <apll>:select</apll control structure.  The <apll>:leave</apll> statement may be used to exit that block before reaching the last statement, similar to the C language <b>break</b> statement.


Each <apll>:case</apll> and <apll>:caselist</apll> may be followed by zero or more statements which form the block of statements controlled by that statement.
Each <apll>:case</apll> and <apll>:caselist</apll> statement may be followed by zero or more statements which form the block of statements controlled by that statement.


The <apll>:select</apll> statement may be followed by a mixture of zero or more <apll>:case</apll> and <apll>:caselist</apll> blocks.  Optionally, the <apll>:else</apll> statement may appear after all <apll>:case</apll> and <apll>:caselist</apll> statements to handle the case where none of the previous <apll>:case</apll> or <apll>:caselist</apll> expressions matched the <apll>:select</apll> expression, similar to the C language <b>default</b> statement.
The <apll>:select</apll> statement may be followed by a mixture of zero or more <apll>:case</apll> and <apll>:caselist</apll> blocks.  Optionally, the <apll>:else</apll> statement may appear after all <apll>:case</apll> and <apll>:caselist</apll> statements to handle the case where none of the previous <apll>:case</apll> or <apll>:caselist</apll> expressions matched the <apll>:select</apll> expression, similar to the C language <b>default</b> statement.


== WHILE Statement ==
== WHILE Statement ==
<table border="0" cellpadding="5" cellspacing="0" rules="none" summary="">
<tr>
  <td><apll>:while <i>expr1</i></apll></td>
  <td></td>
  <td></td>
  <td><apll>:while <i>expr1</i></apll></td>
</tr>
<tr>
  <td>... (Block of statements)</td>
  <td></td>
  <td></td>
  <td>... (Block of statements)</td>
</tr>
<tr>
  <td><apll>:endwhile</apll></td>
  <td></td>
  <td></td>
  <td><apll>:until <i>expr2</i></apll></td>
</tr>
</table>
This statement executes a block of statements repeatedly until the <apll>:while</apll> expression is false, or the <apll>:until</apll> expression is true, or control transfers out of the Control Structure.
The expressions must evaluate to a Boolean-valued scalar or one-element vector.
In the righthand form above, the block of statements is executed and then the expression is executed.  It must evaluate to a Boolean-valued scalar or one-element vector.  If the expression is true, the Control Structure terminates and execution continues with the statement after the <apll>:until</apll> statement; if the expression is false, execution continues at the start of the Control Structure.
The <apll>:while</apll> statement may be followed by zero or more <apll>:andif</apll> statements to narrow the conditions under which the block of statements is executed, or it may be followed by zero or more <apll>:orif</apll> statements to widen the conditions under which the block of statements is executed.  The <apll>:andif</apll> and <apll>:orif</apll> statements may not be mixed after a <apll>:while</apll> statement.
The <apll>:until</apll> statement may be followed by zero or more <apll>:andif</apll> statements to widen the conditions under which execution the block of statements is executed, or it may be followed by zero or more <apll>:orif</apll> statements to narrow the conditions under which the block of statements is executed.  The <apll>:andif</apll> and <apll>:orif</apll> statements may not be mixed after an <apll>:until</apll> statement.
To interrupt the flow of control within a block of statements, use the <apll>:continue</apll> or <apll>:leave</apll> keywords.  The former keyword transfers control to the end of the block continuing with the next repetition, skipping the statements between the <apll>:continue</apll> and matching <apll>:endwhile</apll> or <apll>:until</apll> keywords, but evaluating and acting upon an <apll>:until</apll> statement, if present.  The latter keyword exits the <apll>:while</apll> loop entirely and transfers control to the statement after the matching <apll>:endwhile</apll> or <apll>:until</apll> statement.  Typically, these two keywords appear within <apll>:if</apll> statements.

Revision as of 16:20, 17 August 2008

Overview

:for varname :in expr... ⋄ :endfor Loop through the elements of expr assigning each value to varname, and then execute the statements between :for and :endfor.
:goto expr Transfer control to the line number which corresponds to expr.
:if expr... ⋄ :endif Execute the statements between :if and :endif iff expr is 1.
:repeat ⋄ ... ⋄ :endrepeat Repeatedly execute the statements between :repeat and :endrepeat.
:repeat ⋄ ... ⋄ :until expr Repeatedly execute the statements between :repeat and :until until expr is 0.
:return Execute →0.
:select expr1 ⋄ :case expr2...
⋄ :caselist expr3... ⋄ :endselect
Execute a specific block of statements depending upon which :case or :caselist expression matches expr1.
:while expr... ⋄ :endwhile Repeatedly execute the statements between :while and :endwhile while expr is 1.
:while expr1... ⋄ :until expr2 Repeatedly execute the statements between :while and :until while expr1 is 1 and expr2 is 0.


  • All Control Structures may be placed all on one line as in :for I :in ⍳12 ⋄ ... ⋄ :endfor (very convenient for use in immediate execution mode), or on multiple lines as in
    :for I :in ⍳12
    ...
    :endfor

  • Statement labels may be used on any line which contains a Control Structures. For example,
    [3] L1::if I < 10 ⋄ ...
  • Each Control Structure that closes with a statement-specific keyword (:endfor, :endif, :endrepeat, :endselect, and :endwhile), may instead close with the :end keyword.


FOR Statement

:for varname :in expr
... (Block of statements)
:endfor

This statement evaluates expr once, loops through its elements, assigns each successive value to varname, and then executes the block of statements once for each value in expr. The expr may be of any type (including character and nested), any rank, and any shape. If expr is empty, the block of statements is skipped.

The varname is not localized to the :for loop; upon exiting the loop, varname has the last value assigned to it by the :for loop.

To interrupt the flow of control within a block of statements, use the :continue or :leave keywords. The former keyword transfers control to the end of the block continuing with the next iteration, skipping the statements between the :continue and matching :endfor keywords. The latter keyword exits the :for loop entirely and transfers control to the statement after the matching :endfor statement. Typically, these two keywords appear within :if statements.

GOTO Statement

:goto expr

This statement transfers control to the line number specified in expr. The value of expr must be a numeric simple scalar or one-element vector. This statement is equivalent to expr.

IF Statement

:if expr1
... (Block of statements)
:elseif expr2
... (Block of statements)
:else
... (Block of statements)
:endif

This statement conditionally executes a block of statements.

Each expression must evaluate to a Boolean-valued scalar or one-element vector.

Each :if and :elseif statement may be followed by zero or more statements which form the block of statements controlled by that statement.

The :if statement may be followed by zero or more :elseif blocks. Optionally, the :else statement may appear after all :elseif statements to handle the case where none of the previous expressions was true (evaluated to a 1).

Each :if and :elseif statement may be followed by zero or more :andif statements to narrow the conditions under which the following block of statements is executed, or may be followed by zero or more :orif statements to widen the conditions under which the following block of statements is executed. The :andif and :orif statements may not be mixed within any :if or :elseif statement.

REPEAT Statement

:repeat :repeat
... (Block of statements) ... (Block of statements)
:endrepeat :until expr

This statement executes a block of statements repeatedly (but at least once) until the :until expression is true, or control transfers out of the Control Structure.

In the righthand form above, the block of statements is executed and then the expression is executed. It must evaluate to a Boolean-valued scalar or one-element vector. If the expression is true, the Control Structure terminates and execution continues with the statement after the :until statement; if the expression is false, execution continues at the start of the Control Structure.

The :until statement may be followed by zero or more :andif statements to widen the conditions under which the block of statements is executed, or it may be followed by zero or more :orif statements to narrow the conditions under which the block of statements is executed. The :andif and :orif statements may not be mixed after an :until statement.

To interrupt the flow of control within a block of statements, use the :continue or :leave keywords. The former keyword transfers control to the end of the block continuing with the next repetition, skipping the statements between the :continue and matching :endrepeat or :until keywords. The latter keyword exits the :repeat loop entirely and transfers control to the statement after the matching :endrepeat or :until statement. Typically, these two keywords appear within :if statements.

RETURN Statement

:return

This statement exits the current function and is equivalent to →0.

SELECT Statement

:select expr1
:case expr2
... (Block of statements)
:caselist expr3
... (Block of statements)
:else
... (Block of statements)
:endselect

This statement provides a mechanism for making a choice from multiple cases as to which block of statements is executed. The :select statement expression is evaluated and compared against each successive :case expression and the successive items in each :caselist expression. Control is given to the block of statements whose expression matches the :select expression.

For the :case statement, its expression is compared with the :select statement's expression. The comparison uses the Match function (≡), so it takes into account rank and shape at every level.

For the :caselist statement, the successive items in its expression are compared with the :select statement's expression. As with the :case statement the comparison uses the Match function. The :case statements allows you to combine multiple selection criteria into one expression. It is equivalent to the C language use of multiple case statements preceding a block of statements.

Unlike the C language switch statement, the :case and :caselist expressions need not be constant, and there may be multiple :case or :caselist statements whose expressions are the same value — however only the earliest occurrence may be selected.

When the last statement in a block of statements is executed, the system exits the :select:leave statement may be used to exit that block before reaching the last statement, similar to the C language break statement.

Each :case and :caselist statement may be followed by zero or more statements which form the block of statements controlled by that statement.

The :select statement may be followed by a mixture of zero or more :case and :caselist blocks. Optionally, the :else statement may appear after all :case and :caselist statements to handle the case where none of the previous :case or :caselist expressions matched the :select expression, similar to the C language default statement.

WHILE Statement

:while expr1 :while expr1
... (Block of statements) ... (Block of statements)
:endwhile :until expr2

This statement executes a block of statements repeatedly until the :while expression is false, or the :until expression is true, or control transfers out of the Control Structure.

The expressions must evaluate to a Boolean-valued scalar or one-element vector.

In the righthand form above, the block of statements is executed and then the expression is executed. It must evaluate to a Boolean-valued scalar or one-element vector. If the expression is true, the Control Structure terminates and execution continues with the statement after the :until statement; if the expression is false, execution continues at the start of the Control Structure.

The :while statement may be followed by zero or more :andif statements to narrow the conditions under which the block of statements is executed, or it may be followed by zero or more :orif statements to widen the conditions under which the block of statements is executed. The :andif and :orif statements may not be mixed after a :while statement.

The :until statement may be followed by zero or more :andif statements to widen the conditions under which execution the block of statements is executed, or it may be followed by zero or more :orif statements to narrow the conditions under which the block of statements is executed. The :andif and :orif statements may not be mixed after an :until statement.

To interrupt the flow of control within a block of statements, use the :continue or :leave keywords. The former keyword transfers control to the end of the block continuing with the next repetition, skipping the statements between the :continue and matching :endwhile or :until keywords, but evaluating and acting upon an :until statement, if present. The latter keyword exits the :while loop entirely and transfers control to the statement after the matching :endwhile or :until statement. Typically, these two keywords appear within :if statements.