この種の出力には set-pprint-dispatch が使用されていますか、それともフォーマットで十分ですか?
試してみましょうSET-PPRINT-DISPATCH
:
CL-USER> (let ((*print-pprint-dispatch* (copy-pprint-dispatch)))
(set-pprint-dispatch 'float (lambda (s f) (format s "~,2f" f)))
(write '(A 3.00 (7.10 B) (C 8.12) 0.75) :pretty t))
(A 3.00 (7.10 B) (C 8.12) 0.75) ;; standard output
(A 3.0 (7.1 B) (C 8.12) 0.75) ;; result printed by the REPL
pretty-print ディスパッチ テーブルは変更前にコピーされるため、float に関連付けられた関数は let バインディング内からのみ呼び出されます。の戻り値がWRITE
REPL に出力されると、デフォルトのディスパッチ テーブルが使用されます。グローバル変数を定義して、変更されたテーブルが必要になるたびに再計算されないようにすることができます。
:pretty
の値を指定しない場合、特殊*PRINT-PRETTY*
変数は pretty-printer を使用するかどうかを定義することに注意してください。詳細については、「22.2.1.4 Pretty Print ディスパッチ テーブル」を参照してください。
数字を含むネストされたツリーを印刷したい
任意の数値を float として出力したい場合は、そのREAL
型でディスパッチするだけです (虚数部がゼロでない複素数は思い通りに出力できないため、でディスパッチすることはお勧めしませんnumber
)。必要な強制は暗黙的に行われます。
(let ((*print-pprint-dispatch* (copy-pprint-dispatch)))
(set-pprint-dispatch 'real (lambda (s f) (format s "~,2f" f)))
(write '(A 3 (7.1d0 B) (C 203/25) #C(3/4 0)) :pretty t))
... 書きます:
(A 3.00 (7.10 B) (C 8.12) 0.75)