git.fiddlerwoaroof.com
generic-fun-special-decl.lisp
a8cd04b5
 (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