;;; overrideアドバイス (defun advice:override (x) (push `(override ,x) lst) 'override) (advice:reset) (advice-add 'advice:1 :override 'advice:override) (advice:start) ;; => (:return override :route ;; ((override 256))) ;;; filter-returnアドバイス (defun advice:filter-return (x) (intern (format "%s:filter-return" x))) (advice:reset) (advice-add 'advice:1 :filter-return 'advice:filter-return) (advice:start) ;; => (:return original:filter-return :route ;; ((original 256))) ;;; filter-argsアドバイス (defun advice:filter-args (args) (list (* 2 (car args)))) (advice:reset) (advice-add 'advice:1 :filter-args 'advice:filter-args) (advice:start) ;; => (:return original :route ;; ((original 512))) ;;; before-while/before-until/after-while/after-untilアドバイス (defun advice:true (x) (push `(true ,x) lst) t) (defun advice:false (x) (push `(false ,x) lst) nil) (advice:reset) (advice-add 'advice:1 :before-while 'advice:true) (advice:start) ;; => (:return original :route ;; ((true 256) ;; (original 256))) (advice:reset) (advice-add 'advice:1 :before-while 'advice:false) (advice:start) ;; => (:return nil :route ;; ((false 256))) (advice:reset) (advice:reset) (advice-add 'advice:1 :before-until 'advice:true) (advice:start) ;; => (:return t :route ;; ((true 256))) (advice:reset) (advice-add 'advice:1 :before-until 'advice:false) (advice:start) ;; => (:return original :route ;; ((false 256) ;; (original 256))) (advice:reset) (advice-add 'advice:1 :after-while 'advice:true) (advice:start) ;; => (:return t :route ;; ((original 256) ;; (true 256))) (advice:reset) (advice-add 'advice:1 :after-while 'advice:false) (advice:start) ;; => (:return nil :route ;; ((original 256) ;; (false 256))) (advice:reset) (advice-add 'advice:1 :after-until 'advice:true) (advice:start) ;; => (:return original :route ;; ((original 256))) (advice:reset) (advice-add 'advice:1 :after-until 'advice:false) (advice:start) ;; => (:return original :route ;; ((original 256)))