TC-E Samples

Note

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.

variable-escapes.tig
let
  var one := 1
  var two := 2
  function incr(x: int) : int = x + one
in
  incr(two)
end
tc -XEAeEA variable-escapes.tig
$ 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;
    ()
  )
$ echo $?
0

Warning

Compute the escapes after binding, so that the AST is known to be sane enough (type checking is irrelevant): the EscapeVisitor should not bother with undeclared entities.

undefined-variable.tig
undeclared
tc -e undefined-variable.tig
$ tc -e undefined-variable.tig
undefined-variable.tig:1.1-10: undeclared variable: undeclared
$ echo $?
4

Run your compiler on merge.tig and 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.