> > I don't understand this part, sorry. Why do we need a symbol to > > return the result of the body? > > db-var and func-var are uninterned symbols in the macro expansion but > the variables 'result' and 'commit' marked below aren't. If the intent > is not to expose these variables to the macro's BODY, the inner let > should also uninterned symbols right? Correct, this is what I was hinting at. As annoying as it is, when writing unhygienic macros one should use uninterned symbols to avoid exposing additional variables to the BODY argument. Alternatively, the pattern of `(let ((return (...))) ... return)` can be replaced with `(prog1 (...) ...)`. @Eli: The new patch looks better and closer to how the issue is solved in the Ruby sqlite3 gem. I'm still not sure about this use of `unwind-protect` being correct, but it does preserve the backtrace in case of an error better than when I used `(condition-case e (...) (error (apply #'signal e)))`.