<
Block ::= `{' Stmt*; Result; `}'
Stmt ::= Assign | Iterate | FuncDef | TypeDef
Result ::= { value | return } Expr
<
| return Expr | desugars to | value Expr |
That is, the keywords return and value are synonyms, provided for stylistic reasons. The return/value statement must appear at the end of a Block; there is no analog of the C/C++ return statement that terminates execution of the function in which it appears.
<
Since the Vesta SDL is functional, evaluation of a statement does not produce side-effects, but rather produces a binding. Evaluation of a block occurs by augmenting the context with the bindings produced by evaluating the Stmts, then evaluating the final Expr in the augmented context.
Eval( { value Expr } , C) = Eval( Expr , C)
Eval( { Stmt_1; ...; Stmt_n; value Expr } , C) =
{
val b = Eval( { Stmt_1; ...; Stmt_n } , C);
return Eval( Expr , operator+(C, b));
}
Notice that this second rule introduces an argument to Eval in the ``extended'' language that is not generated by any non-terminal of the grammar.