<
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.