-*- Mode: Text, Spell -*- Notes on implementing deep bindings. 6 Vops: symbol-value-addr(symbol) searches the binding stack for a binding of the supplied symbol and returns its address or the address of the symbol-value slot. symbol-value(addr) set-symbol-value(addr,value) gets (or sets) the symbol value when supplied the address returned by symbol-value-addr. symbol-boundp(addr) predicate testing to see if addr points to the unbound marker. binding-stack-ref(n) binding-stack-set(n,value) Gets (or sets) the value of the n'th binding on the binding stack. Transforms: symbol-value, set, and boundp all have to be specially handled. If the symbol is constant, then they can just be converted into ref/set of a global var. If the symbol isn't constant, then the symbol-value-addr can't be done ahead of time. Refs/Sets of global/special vars: If the symbol is in the cleanup chain, then use binding-stack-{ref,set} with the correct offset. If the symbol isn't on the cleanup chain, then look up the symbol-value-addr at the start of the function and use symbol-value/set-symbol-value at the reference.