You don't need a macro for this. And you don't need (but can certainly use) lexical binding. <!-- language: lang-el --> ;; Without lexical binding: ;; (defun advise-once (symbol where function &optional props) (advice-add symbol :after `(lambda (&rest _) (advice-remove ',symbol ',function))) (advice-add symbol where function props)) ;; With lexical binding: ;; (defun advise-once (symbol where function &optional props) (advice-add symbol :after (lambda (&rest _) (advice-remove symbol function))) (advice-add symbol where function props)) (advise-once 'backward-word :before (lambda (_) (message "Eureka!")))