5.5. Statements

5.5.1. Assignment

Assignment evaluates the expression on the right hand side and assigns it to the storage location identified on the left hand side.

Example:

VAR a: Number

a := 5

5.5.2. Function Call

A function call statement is the same as a function call in an expression, except that the function cannot return a value. See Functions_ for complete information about function calls.

5.5.3. ASSERT

The ASSERT statement evaluates an expression and if the expression is FALSE, prints a diagnostic message and raises an exception.

For example:

LET s: String := "foo"
ASSERT s[0] = "x"       # exception

The output is:

Assert failed (test.neon line 2):
ASSERT s[0] = "x"
Assert expression dump:
  s[0]  is f
  s[0] = "x" is FALSE
Unhandled exception AssertFailedException (ASSERT s[0] = "x") (code 0)
  Stack frame #1: file test.neon line 2 address 213
    ASSERT s[0] = "x"

5.5.4. CASE

The CASE statement selects one of a number of alternative code paths based on the value of an expression.

Example:

VAR x: Number := 0

CASE x
    WHEN < 2 DO
        print("less than two")
    WHEN 2 DO
        print("is two")
    WHEN 3 TO 5 DO
        print("three to five")
    WHEN 7, 9 DO
        print("seven or nine")
    WHEN OTHERS DO
        print("is something else")
END CASE

The CASE statement expression may be of type Number, String, or an enumeration. The possible kinds of WHEN clauses are:

Form

Meaning

WHEN <value>

equality match

WHEN <op> <value>

relational operator comparison (one of =, <>, <, >, <=, >=)

WHEN <value> TO <value>

range check (both endpoints inclusive)

More than one of the above forms may be included in a WHEN clause, separated by commas. The values of WHEN clauses must not overlap. The optional WHEN OTHERS clause is executed when no other WHEN clauses match.

5.5.5. CHECK

The CHECK statement evaluates a boolean expression and, if it is FALSE, evaluates a block:

FUNCTION foo(n: Number)
    CHECK n >= 0 ELSE
        RAISE InvalidValueException
    END CHECK
    print("\(n)")
END FUNCTION

The block of statements must end in a block-exiting statement which is one of EXIT, NEXT, RAISE, or RETURN. This statement is useful to check a condition while guaranteeing that execution will not continue after the END CHECK if the condition is false.

5.5.6. EXEC

TODO

EXEC

5.5.7. EXIT

The EXIT statement has five different forms:

Form

Description

EXIT FOR

stop iteration of the nearest enclosing FOR loop

EXIT FOREACH

stop iteration of the nearest enclosing FOREACH loop

EXIT FUNCTION

immediately return from a function (only for functions that do not return a value)

EXIT LOOP

stop iteration of the nearest enclosing LOOP loop

EXIT REPEAT

stop iteration of the nearest enclosing REPEAT loop

EXIT WHILE

stop iteration of the nearest enclosing WHILE loop

5.5.8. FOR

The FOR loop iterates a numeric variable over a range of values. The loop control variable is implicitly a Number and must not be already declared outside the FOR statement.

Example:

FOR i := 1 TO 10 STEP 2 DO
    print("i is \(i)")
END FOR

The above example is equivalent to:

VAR i: Number

i := 1
WHILE i <= 10 DO
    print("i is \(i)")
    i := i + 2
END WHILE

The exception is that in the FOR loop, the value of i cannot be modified.

The STEP value is optional and defaults to 1. It may be any number, including fractional values, except 0. It must, however, be a compile time constant.

5.5.9. FOREACH

The FOREACH loop iterates through an array from the first element to a last, executing the statements within the block. The loop control variable is implicitly declared and must not be already declared outside the FOREACH statement.

Example:

LET a: Array<String> := ["one", "two", "three"]
FOREACH x IN a DO
    print(x)
END FOREACH

5.5.10. IF

The IF statement tests a condition of type Boolean and executes one of two alternatives.

Example:

VAR x: Number := 0

IF x < 10 THEN
    print("x is less than 10")
ELSE
    print("not less than 10")
END IF

The ELSE clause is optional.

Additional alternatives may be introduced with the ELSIF clause:

VAR x: Number := 0

IF x < 10 THEN
    print("x is less than 10")
ELSIF x < 20 THEN
    print("x is less than 20")
ELSE
    print("not less than 20")
END IF

The IF VALID form is used to test a pointer value to check whether it is NIL, and capture the pointer value in a new variable for use within the IF VALID block:

TYPE Record IS CLASS
    name: String
END CLASS

VAR p: POINTER TO Record := NIL

IF VALID p AS q THEN
    print(q->name)
END IF

5.5.11. INC

The INC statement increments a variable of type Number.

Example:

VAR x: Number := 5
INC x
ASSERT x = 6

In this example, INC x is equivalent to x := x + 1.

5.5.12. LET

The LET statement introduces a new read-only variable and assigns a value (which can be an arbitrary expression, evaluated at run time).

Example:

FUNCTION five(): Number
    RETURN 5
END FUNCTION

LET ten: Number := 2 * five()

5.5.13. LOOP

The LOOP statement begins a loop with no specific exit condition. There is normally an EXIT LOOP statement within the loop for a termination condition.

Example:

VAR i: Number := 0

LOOP
    INC i
    IF i >= 10 THEN
        EXIT LOOP
    END IF
    print("i is \(i)")
END LOOP

5.5.15. RAISE

The RAISE statement raises an exception.

Example:

EXCEPTION InvalidWidgetSizeException

VAR size: Number := 3
IF size > 4 THEN
    RAISE InvalidWidgetSizeException(info WITH size.toString())
END IF

The executor searches for an exception handler that can handle the given expression type, and execution resumes with the exception handler. If no exception handler is found, the program terminates with a message and stack trace.

5.5.16. REPEAT

The REPEAT statement begins a loop with a bottom-tested condition. Execution always proceeds into the loop body at least once.

Example:

VAR x: Number := 0

REPEAT
    print("x is \(x)")
    INC x
UNTIL x = 10

The above loop will print the whole numbers 0 through 9.

5.5.17. RETURN

The RETURN statement returns a value from a function. The type of the expression in the RETURN statement must match the return type declared in the function header (which means that it is only valid to use RETURN for a function that actually returns a value).

Example:

FUNCTION square(x: Number): Number
    RETURN x ^ 2
END FUNCTION

5.5.18. TRY

The TRY statement introduces a block that handles exceptions. After entering a TRY block, any exception that happens within the block is checked against the TRAP clauses. If an exception matching a clause is raised, the corresponding exception handler starts running.

Example:

EXCEPTION InvalidWidgetSizeException

VAR size: Number := 5
TRY
    IF size > 4 THEN
        RAISE InvalidWidgetSizeException(info WITH size.toString())
    END IF
TRAP InvalidWidgetSizeException AS x DO
    print("Invalid size \(x.info)")
END TRY

5.5.19. WHILE

The WHILE statement begins a loop with a top-tested condition. The condition is tested before every loop iteration, including the first one.

Example:

VAR x: Number := 0

WHILE x < 10 DO
    print("x is \(x)")
    INC x
END WHILE

The above loop will print the whole numbers 0 through 9.