[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How do you override CLOS:PRINT-OBJECT?

    Date: Fri, 15 Jun 1990 18:37:17 EDT
    From: DUMOULIN@TITAN.KSC.NASA.GOV (Jim Dumoulin)

    ;;; Gets you Error - Attempt to access not existent symbol CLOS:M
    CLOS:(defmethod print-object ((m sport::measurement) stream &rest ignore)
      (format stream "#<~A-~A>"
	      (class-name (class-of m))
	      (sport::m-name m)))

By putting the CLOS: outside the list you are trying to read the symbol
CLOS:M, which doesn't exist.

    ;;; Gets you Error - Lambda lists arn't congruent
    (CLOS:defmethod CLOS:print-object ((m SPORT::measurement) stream &rest ignore)
      (format stream "#<~A-~A>"
	      (CLOS:class-name (CLOS:class-of m))
	      (sport::m-name m)))

"Show CLOS Generic Function PRINT-OBJECT" says that the arguments are
(OBJECT STREAM).  The descriptions on p.850 of CLtL2 and 244 of Keene's
book both agree with this.  The argument list of all methods for a
generic function must agree with the argument list for the generic
function; you aren't permitted to add additional &optional, &rest, or
&key parameters (well, actually there is some weirdness with &key, but
that's beside the point).

PCL isn't exactly CLOS, so it may not have the same method signature for
PRINT-OBJECT or it may not do all the congruency checking that's

So, remove the "&rest ignore" from the above version and you should be

    ;;; compiles but isn't called when the object attempts to print itself
    (CLOS:defmethod print-object ((m SPORT::measurement) stream &rest ignore)
      (format stream "#<~A-~A>"
	      (CLOS:class-name (CLOS:class-of m))
	      (sport::m-name m)))

All CLOS-specific functions are in the CLOS package, so the function to
specialize is CLOS:PRINT-OBJECT.