Main interpreter loop needs to be a series of let-expressions
Hope I can explain the issue properly here. Basically, for proper typechecking of recursive functions, we need to define global symbols using a let-expression to name them. Creating a name via set! won't work properly in the type inference module, because we aren't making use of let-polymorphism.
We need to resolve this top-level behavior and make (define ...) expand to different code. It's also a question whether we can/should use delimited continuations (shift/reset) for this purpose.