The error function seems to bypass use of *error-hook* -- perhaps(?) that makes sense, but error needs to unwind the handler stack.
ts> (catch 'baz (error "msg e"))
Error: msg e
ts> (sin 5.0)
Would dynamic-wind help in the implementation of catch to make sure the handler stack is unwound?
Should the uses of error in the code be changed to use *error-hook*? E.g., string->anyatom anyatom->string quasiquote