IMHO, it would be cleaner if def behaved more like Scheme's internal define (i.e. create a new local binding and set!).
I'd keep the current behaviour of def under the name defglobal or something.
-----