具有cl:格式的列表中每隔三个单词后的换行符

Mar*_*han 5 lisp format common-lisp

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

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

但我想:

;=> "one two three  
; four five six  
; seven eight nine  
; ten "  
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 17

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

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

但是,您可能有许多不能被3整除的参数,在这种情况下,您需要提前终止迭代.~^如果没有更多参数,您可以使用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
"
Run Code Online (Sandbox Code Playgroud)

当元素的数量可以被三整除时,您可能不需要最终换行符,在这种情况下,您也可以~^在换行符之前添加一个换行符:

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

这种构造对于编写分隔列表特别好:

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

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

22.3.7.4 Tilde Left-Brace:迭代

〜{STR〜}

这是一个迭代构造.参数应该是一个列表,它用作一组参数,就像对格式的递归调用一样.该字符串str等,反复使用控制线.每次迭代都可以吸收尽可能多的列表元素作为参数; 如果str单独使用两个参数,那么列表的两个元素每次都会在循环中用完.如果在任何迭代步骤之前列表为空,则终止迭代.此外,如果给出前缀参数n,则最多n 次重复处理str.最后,该~^指令可用于过早终止迭代.

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