(defun defadvice:start () (let (lst) `(:return ,(defadvice:1 256) :route ,(nreverse lst)))) (defun defadvice:reset () "`defadvice:1'にかけられたadviceを全部削除する" (ad-disable-regexp "defadvice-test-") (ad-update 'defadvice:1)) ;;; 元の挙動 (defun defadvice:1 (x) (push `(original ,x) lst) 'original) (defadvice:reset) (defadvice:start) ;; => (:return original :route ;; ((original 256))) ;;; beforeアドバイス (defadvice defadvice:1 (before defadvice-test-before activate) (push `(before ,x) lst) 'before) (defadvice:start) ;; => (:return original :route ;; ((before 256) ;; (original 256))) ;;; afterアドバイス (defadvice defadvice:1 (after defadvice-test-after activate) (push `(after ,x) lst) 'after) (defadvice:start) ;; => (:return original :route ;; ((before 256) ;; (original 256) ;; (after 256))) ;;; aroundアドバイス (defadvice defadvice:1 (around defadvice-test-around activate) (push `(around-1 ,x) lst) ad-do-it (push `(around-2 ,x) lst) (setq ad-return-value 'around)) (defadvice:start) ;; => (:return around :route ;; ((before 256) ;; (around-1 256) ;; (original 256) ;; (around-2 256) ;; (after 256)))