A Russell conditional expression has syntax

if
    guard_expression ==> expression; ...; expression
#   guard_expression ==> expression; ...; expression
    ...
#   guard_expression ==> expression; ...; expression
fi

A guard_expression can be either an expression with signature "val Boolean",
or the keyword "else".  The latter is an abbreviation for the negations
of all non-else guard_expressions "and"ed together.

The rightmost expressions corresponding to the guards must all have the same
signature, unless the conditional is followed by a ";" and another expression
(or it occurs inside a block with this property), or it is the body of
a function construction with val Void result signature.

The conditional is evaluated by evaluating the guard_expressions
in any order, until a true guard is found, and then evaluating the expression
sequence corresponding to the guard.  It is guaranteed that syntactically
identical conditionals appearing in the same environment will yield
the same result.  It is an error to evaluate a conditional with no true
guards.

The syntax

if guard_expression1 then
    expression; ...; expression
elsif guard_expression2 then
    expression; ...; expression
else
    expression; ...; expression
fi

abbreviates

if
    guard_expression1 ==> expression; ...; expression
#   else ==>
	if
	    guard_expression2 ==>
		expression; ...; expression
	#   else ==>
		expression; ...; expression
	fi
fi

Any number of "elsif"s may appear.  A missing else clause defaults
to "else ==> Null[]", where "Null" is always taken to be the predefined
identifier, even if it has been redeclared in an intervening scope.

Implementation Note:  The compiler really does reorder the first kind
of conditional.  Relying on first to last evaluation is likely to result
in disaster.  If order matters, use "if ... then ...".

