> In particular, this might very well break in bullet
It works:
func foo (x): fn () x
print ((foo 4)) // prints 4
I explained incorrectly: the interpreter env stack is basically a stack of bindings representing both "true" locals (i.e. locals on JVM) and environments representing lexical scopes. The latter are held for instance by functions, macros, modules explicitly, and also get implicitly created as required in e.g. looping primitives.
I'll reply to your other points tomorrow morning! (basically, I agree :))