It overrides bar and so the call to foo fails. You're right, that does seem like action at a distance.
Hmm, that's because I'm using plain dynamic scopes for assign, and therefore for def.
"rather than throwing an "undefined variable" error like Racket does, it would instead just grab the value from the caller's scope."
Yeah, you're right.
---
4 hours later
Now working: http://github.com/akkartik/wart/commit/8806dd7109
(ignore the reference to broken if; that's fixed later as well)