If I understand correctly 22.2.1.4 states, that current *print-pprint-dispatch* tables takes precedence over "user-defined print-object methods because the current pprint dispatch table is consulted first" – that's if *print-pretty* is T.
If *print-pretty* is nil, then description of PRINT-OBJECT (22.4.11) states:
"Users may write methods for print-object for their own classes if they do not wish to inherit an implementation-dependent method."
what might be a hint, that users can't write methods for print-object for classes which are not "their own".
Regards, Daniel
Edi Weitz writes:
The following "works" in three different CL implementations I tried while in three others the way complex numbers are printed doesn't change.
? (defmethod print-object ((obj complex) stream) (format stream "#< ~A + ~A * I >" (realpart obj) (imagpart obj))) #<STANDARD-METHOD PRINT-OBJECT (COMPLEX T)> ? #c(1 1) #< 1 + 1 * I >
My understanding of 22.1.2 of the standard is that each Lisp MUST have a PRINT-OBJECT method for complex numbers. The question then is whether I'm allowed to redefine it like above (I think I am) and/or whether an implementation is allowed to accept this redefinition without a warning but then to ignore it (which, as I said, is what happens in three respectable Lisps).
Thanks, Edi.
[Note: There's no point in talking me out of this as I don't actually want to do it anyway. It's just an example and I'm only interested in what exactly is governed by the standard. Complex numbers are also just an example. I'm interested in PRINT-OBJECT for built-in classes in general.]