I managed to resolve the bind I had found myself in yesterday, but switching from reuse via polymorphism to reuse via state change. This was not too painful as the function in question was already pretty stateful. So instead I just have the caller do final bit of computation and clean-up.
However, I then spent nearly the entirety of the afternoon chasing after a bug, that I now strongly believe has more to do some fundamental assumptions I made when I designed the constraint system versus sloppy coding or some such. Hopefully I'll figure something out tomorrow.
At this point I am less likely to rewrite major portions of the InforML code base in another language, though I am seriously thinking about implementing the core language type checker and evaluator in Coq or Scala. Though I am somewhat skeptical as to whether my schedule will allow me to really take advantage of the expressiveness allowed by Coq's type system, or whether it will just get in the way.
I'm also seriously considering taking a few days this week to just focus on making the current InforML codebase easier to debug and maintain. On one-hand, this code will never be used as anything more than a prototype for experimentation (unless I were to use it to write a bootstraping compiler in some unknown future) so I don't want to spend too much time on things that will just be thrown away before too long. However, if it can save me from another afternoon of debugging like today, maybe it would be worth it.