在带有 cl:format 的列表中每三个单词之后换行



如何在列表中每三个参数之后添加回车符(使用~%)?
例如,我现在有:

(format nil "~{~a ~}" (list '"one" '"two" '"three" '"four" '"five" '"six" '"seven" '"eight" '"nine" '"ten"))  
;=> "one two three four five six seven eight nine ten " 

但我想:

;=> "one two three  
; four five six  
; seven eight nine  
; ten "  

~{str~}str的格式字符串可以在每次迭代中使用列表中的多个参数。 这意味着,如果您有一个保证可以被三整除的参数列表,则可以使用格式字符串,例如 ~{~a ~a ~a~%~} . 下面是一个示例:

CL-USER> (format nil "~{~a ~a ~a~%~}" '(1 2 3 4 5 6))
"1 2 3
4 5 6
"

但是,您可能有许多参数不能被三整除,在这种情况下,您需要提前终止迭代。 如果没有更多参数,您可以使用 format 指令~^中断。 由于您可能会在第一个或第二个参数之后出现这种情况,因此您应该在这些位置之后添加其中一个。 下面是具有零、一和两个尾随参数的情况的示例:

CL-USER> (format nil "~{~a~^ ~a~^ ~a~%~}" '(1 2 3 4))
"1 2 3
4"
CL-USER> (format nil "~{~a~^ ~a~^ ~a~%~}" '(1 2 3 4 5))
"1 2 3
4 5"
CL-USER> (format nil "~{~a~^ ~a~^ ~a~%~}" '(1 2 3 4 5 6))
"1 2 3
4 5 6
"

当元素数可被 3 整除时,您可能不希望使用最后一个换行符,在这种情况下,您也可以在换行符之前添加一个~^

CL-USER> (format nil "~{~a~^ ~a~^ ~a~^~%~}" '(1 2 3 4 5 6))
"1 2 3
4 5 6"

这种结构特别适合编写分隔列表:

CL-USER> (format nil "write(~{~a~^,~})" '("fd" "buf" "count"))
"write(fd,buf,count)"

这些格式指令(及其变体)在 HyperSpec 中有更详细的描述(链接页面中的内容比这里引用的内容更多):

22.3.7.4 左大括号波浪号:迭代

~{str~}

这是一个迭代构造。参数应该是一个列表,它 用作一组参数,就像对格式的递归调用一样。 字符串 str 重复用作控制字符串。每 迭代可以吸收列表中的任意数量的元素,只要它喜欢 参数;如果 str 自己用掉两个参数,则两个元素 的列表每次循环都会用完。如果之前有 迭代步骤 列表为空,则迭代终止。 此外,如果给出前缀参数 n,则最多会有 n重复处理可疑交易报告。最后,~^指令可以是 用于提前终止迭代。

您可能还对以下问题感兴趣:

  • 在列表中联接字符串的规范方法是什么?
  • 需要有关如何在 lisp 中打印矩阵的建议
  • 设置列表格式

最新更新