But then what would (my-apply + 1 2 3 :debug #t 4 5 6) expect? Perhaps this would be usable: (define-macro* (my-apply debug :rest rest) `(if (not (boolean? ,debug)) (apply ,debug ',rest) (begin (when ,debug (format *stderr* "debugging\n")) (apply ,(car rest) ',(cdr rest)))))