Common Lisp中format遍历子列表时如何实现最后迭代省略分隔符?
解决Common Lisp Format中子列表间的分隔问题
你的问题出在对~:{和~^的作用范围理解上:~:{用于遍历每个子列表,将子列表内的元素对应到格式指令的参数;而你把~^,放在了~:{的内部,这导致它只会作用于子列表内部的元素迭代,而非你期望的子列表之间的分隔。
要实现子列表间用逗号分隔的效果,你需要把控制分隔的~^,放到外层的子列表迭代结构中,具体有两种写法:
写法一:直接处理固定长度的子列表
如果每个子列表的元素数量固定(比如这里都是两个),可以直接用外层~{遍历子列表,内部直接用~d匹配元素:
(format nil "[~{[~d,~d]~^,~}]" '((1 2) (3 4))) ;; -> "[[1,2],[3,4]]"
外层~{负责遍历每个子列表,[~d,~d]处理单个子列表的元素,~^,则控制:只有当还有下一个子列表时,才输出逗号。
写法二:嵌套使用~:{(适用于子列表长度不固定的场景)
如果子列表的元素数量不固定,需要用~:{来处理子列表内部的元素,可以在外层嵌套~{来遍历子列表:
(format nil "[~{~:{[~d,~d]~}~^,~}]" '((1 2) (3 4))) ;; -> "[[1,2],[3,4]]"
外层~{遍历所有子列表,内层~:{处理每个子列表的元素生成[x,y]格式,~^,同样控制子列表间的逗号输出。
内容的提问来源于stack exchange,提问作者vmonteco
相关产品推荐
相关产品推荐

