I’m not sure how the different Common Lisp implementation do it. In Erlang you have old code and new code. You can transform your data from old code to new code with a function. No need for deduction, it’s explicitly done by the programmer. Threads do not need to be paused: new invocations of functions are using the new code, old code still running old functions run the old code. At some point you need to ensure that no old code is running at all before making a new code swap.
In practice this is rarely used outside of embedded systems.
I love the different perspective that Chas Emerick brings with OCaml. He has a Lisp background so it’s even more interesting.