structure the compiler after clojure.lang.Compiler