One interesting property of emacs lisp is that a macro can't do an early return from a function. You either need a wrapper (like cl-block or cl-defun) or you have to signal. C macros (including those in Emacs itself) don't have this property, making it harder to reason about.