What's wrong with (defmacro let-if (test bindings &body body) (let ((f (gensym))) `(flet ((,f () ,@body)) (if ,test (let ,bindings (,f)) (,f))))) ?