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 自体が完全に破壊されます。
誰かがそのような違いに光を当て、それが存在する場合、私の目的を達成するための問題の少ない別の方法を提案できますか?