是 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
由于漂亮打印调度表是在修改之前复制的,因此与浮点数关联的函数只能从 let-binding 内部调用。当 的返回值WRITE
打印到 REPL 时,使用默认的调度表。您可以定义一个全局变量以避免每次需要时重新计算修改后的表。
请注意,如果您不给 值:pretty
,则特殊*PRINT-PRETTY*
变量定义是否使用漂亮打印机。有关详细信息,请参阅22.2.1.4 漂亮打印调度表。
我想打印一个包含数字的嵌套树
如果您想要将任何数字输出为浮点数,只需在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)