This example demonstrates the computation and display of escaping variables (and formal arguments). By default, all the variables must be considered as escaping, since it is safe to put a non escaping variable onto the stack, while the converse is unsafe.
let var one := 1 var two := 2 function incr(x: int) : int = x + one in incr(two) end
$ tc -XEAeEA variable-escapes.tig /* == Abstract Syntax Tree. == */ function _main() = ( let var /* escaping */ one := 1 var /* escaping */ two := 2 function incr(/* escaping */ x : int) : int = (x + one) in incr(two) end; () ) /* == Abstract Syntax Tree. == */ function _main() = ( let var /* escaping */ one := 1 var two := 2 function incr(x : int) : int = (x + one) in incr(two) end; () )
Compute the escapes after binding, so that the AST is known to be
sane enough (type checking is irrelevant): the
should not bother with undeclared entities.
$ tc -e undefined-variable.tig error→undefined-variable.tig:1.1-10: undeclared variable: undeclared ⇒4
Run your compiler on merge.tig and to study its output. There is a number of silly mistakes that people usually make on TC-E: they are all easy to defeat when you do have a reasonable test suite, and once you understood that torturing your project is a good thing to do.