From: Hannah S. <ha...@sc...> - 2001-05-15 16:03:27
|
[posted to comp.lang.lisp and mailed to sbcl-devel at lists dot sourceforge ... because of bug analysis] Hello! In article <m34ruue9js.fsf@localhost.localdomain>, Lieven Marchand <ma...@wy...> wrote: >ha...@sc... (Hannah Schroeter) writes: >[...] >> (defclass a () ()) >> (defclass b () ()) >> (defmethod make-instance ((class (eql (find-class 'a))) &key &allow-other-keys >> &rest args) >> (apply #'make-instance 'b args)) >[...] >> (let ((x (make-instance 'a))) >> (class-of x)) >> yields >> #<STANDARD-CLASS A> >> while >> (let ((x (make-instance (find-class 'a)))) >> (class-of x)) >> yields >> #<STANDARD-CLASS B> >[...] >I'm afraid you've found a bug in sbcl ;-) >Section 7.1.7 of the CLHS states >[...] Looks so. In sbcl, make-instance has these methods by default: 1. #<FUNCTION "DEFMETHOD MAKE-INSTANCE (COMMON-LISP:CLASS)" {1060ABC9}> is a function. 2. #<FUNCTION "DEFMETHOD MAKE-INSTANCE (SYMBOL)" {106022D1}> is a function. 3. #<FUNCTION "DEFMETHOD MAKE-INSTANCE (CLASS)" {106023D1}> is a function. 1. and 3. seem to be distinct. Now, 2. is implemented like this: (in-package "SB-PCL") ... (defmethod make-instance ((class symbol) &rest initargs) (apply #'make-instance (find-class class) initargs)) Now, there are different cl:find-class and sb-pcl:find-class. The method for symbol seems to use #'sb-pcl:find-class, which seems to return a sb-pcl:class; while the (cl:)find-class in (defmethod make-instance ((class (find-class 'a)) &rest initargs) (apply #'make-instance (find-class 'b) initargs)) seems to return a cl:class. So after that defmethod, (make-instance 'a) => (make-instance #<SB-PCL:CLASS A>) => create an instance of A while (make-instance (find-class 'a)) => (make-instance #<CL:CLASS A>) => (match the eql specialized method) (make-instance (find-class 'b)) => creates an instance of B. Kind regards, Hannah. |