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
|