either I'm missing something very stupid or the scope of special variables is unexpectedly different for defmethod and defun (tested using SBCL 1.1.14):
As expected:
(defun ttprint-object (prefix out) (format out "~A: in defun: < ~A >~%" prefix *print-readably*)) (let ((*print-readably* t)) (format t "let: calling defun: < ~A >~%" *print-readably*) (ttprint-object "from let" t)) let: calling defun: < T > from let: in defun: < T >With let defmethod works different from defun, so unexpected:
(defclass empty () ()) (defmethod print-object ((self empty) out) (format out "in defmethod: < ~A >~%" *print-readably*) (ttprint-object "from defmethod" out)) (let ((*print-readably* t)) (ttprint-object "from let" t) (format t "let: calling defmethod: < ~A >~%" *print-readably*) (format t "let: ~A" (make-instance 'empty))) from let: in defun: < T > let: calling defmethod: < T > let: in defmethod: < NIL > from defmethod: in defun: < NIL >Also with setf defmethod works different from defun but same as with let:
(progn (setq *print-readably* t) (ttprint-object "from setf" t) (format t "setf: calling defmethod: < ~A >~%" *print-readably*) (format t "setf: ~A" (make-instance 'empty))) from setf: in defun: < T > setf: calling defmethod: < T > setf: in defmethod: < NIL > from defmethod: in defun: < NIL >
Hopefully it's me...
Thanks in advance, Frank