尝试不以标准列表表示法打印 conses,而是始终以点对形式打印,以最小的努力,我以这种方式重新定义了print-object
该方法:
(defmethod print-object((c cons) str)
(format str "(~a . ~a)" (car c) (cdr c)))
但是对于不同的实现效果是不同的。
在 Clozure CL 和 LispWorks Personal 中,结果是我所期待的:
CL-USER 1 > (defmethod print-object((c cons) str)
(format str "(~a . ~a)" (car c) (cdr c)))
#<STANDARD-METHOD PRINT-OBJECT NIL (CONS . (T . NIL)) 200A45AB>
CL-USER 2 > '(a b c )
(A . (B . (C . NIL)))
而在 SBCL 和 AllegroCLexpress 中,列表的打印方式没有任何变化:
* (defmethod print-object((c cons) str)
(format str "(~a . ~a)" (car c) (cdr c)))
#<STANDARD-METHOD PRINT-OBJECT (CONS T) {10051EBC53}>
* '(a b c)
(A B C)
所以,我想知道这是否是由于语言规范中的一些歧义,如果这种行为被明确声明为未指定,如果这是由于 REPL 与包的某些交互,或者最后,如果有实现就这个定义而言是正确的,而其他的则不正确。最后要注意的是,在 SLIME 中给出这样的定义会对 SLIME 本身造成严重破坏!
有人可以阐明这些差异,并提出一种替代方法(如果存在的话,那么问题较小)来实现我的目标?