app load ["Lexer","Reducers"];

open Lambda;

local 

    fun error msg = (print msg; print "\n")
	
    fun handler (Lambda.Internal s)    = error ("Internal error: " ^ s)
      | handler (Fail s)               = error ("Failure: " ^ s)
      | handler (Parsing.ParseError _) = 
	error ("Parse error: `" ^ Format.expression ^ "'")
      | handler (Lexer.LexicalError (s,_,_)) = error ("Lexical error: " ^ s)
      | handler (Env.Env s)            = error s
      | handler exn                    = raise exn

    val env0 = foldl Env.addenv Env.empty Lambda.binds0	

fun readlam s = 
    let val lexbuf       = Lexing.createLexerString s
	val (binds, lam) = Parser.Input Lexer.Token lexbuf
 	val env1         = foldl Env.addenv env0 binds 
    in (lam, env1) end;

val _ = quotation := true;

fun run tracer (reducer : Env.env -> lam -> (lam -> unit) -> lam) 
    [QUOTE s : unit frag] =
    let val (lam, env) = readlam s
    in tracer ~1 (reducer env) (Env.mkglobal Var env lam) end
  | run tracer reducer _ = raise Internal "loadlam.run";

in

open Reducers;

val show = run show
val trace = run trace 
val tracelabel = run tracelabel
val single = run single
val dot = run dot
val count = run count
fun printenv () = Env.printenv env0
end
