如何用Common Lisp格式指令实现等效的漂亮打印逻辑?
用格式指令实现等价的Common Lisp漂亮打印逻辑
你可以使用FORMAT的迭代指令结合换行、缩进控制,写出和原代码语义完全一致的紧凑格式指令,以下是两种实现方式:
强制换行版本(完全匹配示例输出)
这个版本会强制每个键值对的键和值换行,和你给出的示例输出完全一致:
CL-USER> (let ((properties '(:a "the letter a" :b "the letter b" :a-property-with-a-long-key "and a very long value"))) (format t "(~{~& (~A~% ~A)~})" properties)) ;; 输出 ((:A "the letter a") (:B "the letter b") (:A-PROPERTY-WITH-A-LONG-KEY "and a very long value")) ;; 返回值 NIL
格式指令拆解:
(~{~}~):外层迭代结构,遍历properties列表中的元素~&:开启新的逻辑行,确保每个键值对组单独占一行并缩进2个空格(~A~% ~A):将每个键值对包裹在括号内,~A打印键,~%强制换行后缩进3个空格打印值- 最外层的
(和)对应原代码pprint-logical-block的:prefix和:suffix
线性换行版本(贴近原代码的:linear语义)
如果你希望保留原代码中(pprint-newline :linear)的行为——当行空间足够时键值对同行显示,不足时才换行,可以用~@_替代~%:
CL-USER> (let ((properties '(:a "the letter a" :b "the letter b" :a-property-with-a-long-key "and a very long value"))) (format t "(~{~& (~A~@_ ~A)~})" properties))
这个版本的~@_会根据当前行剩余空间决定是否换行,和原代码的线性换行逻辑完全一致,输出效果在空间足够时会更紧凑,空间不足时和示例输出一致。
内容的提问来源于stack exchange,提问作者Michaël Le Barbier
相关产品推荐
相关产品推荐

