module til-eval-var imports til-eval-exp strategies eval-declaration = (?Declaration(x) <+ ?DeclarationTyped(x, t)) ; rules( EvalVar+x :- Var(x) ) eval-assign = Assign(?x, eval-exp => val) ; rules(EvalVar.x : Var(x) -> val) EvalRead : FunCall("read", []) -> String(x) where stdin-stream; read-text-line => x eval-write = ?ProcCall("write", []) ; ?String() ; (, []) VarUndefined = ?Var() ; fatal-err(|["variable ", , " used before being defined"]) eval-exp = eval-exp(EvalVar <+ VarUndefined <+ EvalRead)