The eval throwing away context does not make any sense in retrospect. I think I made it that way because of some ghetto-scoping ideas.
You broke car and cdr somehow (these don't evaluate their arguments anymore), but I have no idea how you did this.
This was mostly a training exercise, this is why there is no significant use of monads in there: I simply haven't learned enough about them to feel comfortable using them.