Simpler Version with the Same Problem
(defmacro if-n-z-p-alt2 (expr f1 f2 f3)
Even though a new binding of X is created when the macro expansion is executed, any use of X in f1, f2, or f3 will end up referencing this binding rather than the global binding (variable capture).