git.fiddlerwoaroof.com
Raw Blame History
(defpackage :fwoar.generic-fun-special-decl
  (:use :cl )
  (:export ))
(in-package :fwoar.generic-fun-special-decl)

(defgeneric foo (arg))
(let (*arg*)
  (declare (special *arg*))
  (defmethod foo :around (*arg*)
             (declare (special *arg*))
             (format t "~&*ARG* in :around: ~s~%" *arg*)
             (call-next-method))
  (defmethod foo :before (arg)
             (declare (ignore arg))
             (format t "~&*ARG* in :before: ~s~%" *arg*))
  (defmethod foo :after (arg)
             (declare (ignore arg))
             (format t "~&*ARG* in :after: ~s~%" *arg*))
  (defmethod foo ((arg string))
    (format t "~&*ARG* in method for string: ~s~%" *arg*)
    (let ((*arg* (parse-integer *arg*)))
      (declare (special *arg*))
      (format t "~&*ARG* in method for string, after rebinding: ~s~%" *arg*)
      (call-next-method)))
  (defmethod foo (arg)
    (declare (ignore arg))
    (format t "~&*ARG* in method for t: ~s~%" *arg*)))


#|
FWOAR.GENERIC-FUN-SPECIAL-DECL> (foo "4")
*ARG* in :around: "4"
*ARG* in :before: "4"
*ARG* in method for string: "4"
*ARG* in method for string, after rebinding: 4
*ARG* in method for t: 4
*ARG* in :after: "4"
|#

;; in: DEFMETHOD FOO :AROUND (T)
;;     (DEFMETHOD FWOAR.GENERIC-FUN-SPECIAL-DECL::FOO :AROUND
;;                (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*)
;;       (DECLARE (SPECIAL FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*))
;;       (FORMAT T "~&*ARG* in :around: ~s~%" FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*)
;;       (CALL-NEXT-METHOD))
;; --> PROGN EVAL-WHEN SB-PCL::%DEFMETHOD-EXPANDER 
;; --> SB-PCL::LOAD-DEFMETHOD LIST* LET* SB-INT:NAMED-LAMBDA FUNCTION 
;; --> SYMBOL-MACROLET SB-PCL::FAST-LEXICAL-METHOD-FUNCTIONS 
;; --> SB-PCL::BIND-FAST-LEXICAL-METHOD-FUNCTIONS FLET CALL-NEXT-METHOD 
;; --> BLOCK SB-PCL::FAST-CALL-NEXT-METHOD-BODY IF IF SB-PCL::BIND-ARGS 
;; ==>
;;   (LET* ((SB-PCL::.ARGS-TAIL. SB-PCL::CNM-ARGS)
;;          (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG* (POP SB-PCL::.ARGS-TAIL.))
;;          (SB-PCL::.DUMMY0.))
;;     (DECLARE (IGNORABLE SB-PCL::.ARGS-TAIL. SB-PCL::.DUMMY0.))
;;     (SB-PCL::INVOKE-NARROW-EFFECTIVE-METHOD-FUNCTION SB-PCL::.NEXT-METHOD-CALL.
;;                                                      NIL :REQUIRED-ARGS
;;                                                      (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*)
;;                                                      :REST-ARG NIL))
;; 
;; caught STYLE-WARNING:
;;   using the lexical binding of the symbol (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*), not the
;;   dynamic binding, even though the name follows
;;   the usual naming convention (names like *FOO*) for special variables

;; in: DEFMETHOD FOO :AROUND (T)
;;     (DEFMETHOD FWOAR.GENERIC-FUN-SPECIAL-DECL::FOO :AROUND
;;                (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*)
;;       (DECLARE (SPECIAL FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*))
;;       (FORMAT T "~&*ARG* in :around: ~s~%" FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*)
;;       (CALL-NEXT-METHOD))
;; --> PROGN EVAL-WHEN SB-PCL::%DEFMETHOD-EXPANDER 
;; --> SB-PCL::LOAD-DEFMETHOD LIST* LET* SB-INT:NAMED-LAMBDA FUNCTION 
;; --> SYMBOL-MACROLET SB-PCL::FAST-LEXICAL-METHOD-FUNCTIONS 
;; --> SB-PCL::BIND-FAST-LEXICAL-METHOD-FUNCTIONS FLET CALL-NEXT-METHOD 
;; --> BLOCK SB-PCL::FAST-CALL-NEXT-METHOD-BODY IF IF SB-PCL::BIND-ARGS 
;; ==>
;;   (LET* ((SB-PCL::.ARGS-TAIL. SB-PCL::CNM-ARGS)
;;          (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG* (POP SB-PCL::.ARGS-TAIL.))
;;          (SB-PCL::.DUMMY0.))
;;     (DECLARE (IGNORABLE SB-PCL::.ARGS-TAIL. SB-PCL::.DUMMY0.))
;;     (SB-PCL::INVOKE-NARROW-EFFECTIVE-METHOD-FUNCTION SB-PCL::.NEXT-METHOD-CALL.
;;                                                      NIL :REQUIRED-ARGS
;;                                                      (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*)
;;                                                      :REST-ARG NIL))
;; 
;; caught STYLE-WARNING:
;;   using the lexical binding of the symbol (FWOAR.GENERIC-FUN-SPECIAL-DECL::*ARG*), not the
;;   dynamic binding, even though the name follows
;;   the usual naming convention (names like *FOO*) for special variables
;; 
;; compilation unit finished
;;   caught 2 STYLE-WARNING conditions