gpt4 book ai didi

lisp - 列表中项目数量可变的格式的理由

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:37 24 4
gpt4 key购买 nike

所以我可以这样做:

CL-USER> (format t "~80<~a~;~a~;~a~;~a~>~%" "hello" "how are you" "i'm fine" "no you're not")
hello how are you i'm fine no you're not

它按照指定在 80 的范围内均匀地间隔 4 个字符串。

但是,我想传递一个字符串列表,并让它根据列表中的数量来证明这些字符串的合理性。

这些都不行:

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

CL-USER> (format t "~80<~{~a~;~}~>~%" '(1 2 3 4 5 6))
; Evaluation aborted on #<SB-FORMAT:FORMAT-ERROR {126651E1}>.
; ~; not contained within either ~[...~] or ~<...~>

有办法吗?

最佳答案

您可以使用 (format stream (format nil ...)) 执行此操作,您可以在其中使用 format 生成用于调整的格式控件:

CL-USER> (format nil (format nil "|~~40<~{~a~^~~;~}~~>|" '(1 2 3 4 5)))
"|1 2 3 4 5|"
CL-USER> (format nil (format nil "|~~40<~{~a~^~~;~}~~>|" '(1 2 3 4 5 6 7 8 9 10)))
"|1 2 3 4 5 6 7 8 9 10|"
CL-USER> (format nil (format nil "|~~40<~{~a~^~~;~}~~>|" '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)))
"|1 2 3 4 5 6 7 8 9 10 11 12 13 14 15|"

如果您不想为外部format 生成整个格式控制,您可以使用一些~? 的变体来递归地处理一个字符串和一些参数:

CL-USER> (format nil "|~@?|" (format nil "~~40<~{~a~^~~;~}~~>" '(1 2 3 4 5)))
"|1 2 3 4 5|"
CL-USER> (format nil "|~@?|" (format nil "~~40<~{~a~^~~;~}~~>" '(1 2 3 4 5 6 7 8 9 10)))
"|1 2 3 4 5 6 7 8 9 10|"
CL-USER> (format nil "|~@?|" (format nil "~~40<~{~a~^~~;~}~~>" '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)))
"|1 2 3 4 5 6 7 8 9 10 11 12 13 14 15|"

使用~? 的递归处理只允许您使用参数列表处理另一个格式控件;它没有为您提供拼接新格式字符串的方法。似乎对齐的文本必须出现在控制字符串中,因此您确实需要一种方法来拼接已包含所需文本的控制字符串。

虽然第一种情况看起来更简单,但其中存在危险,因为您将打印的文本放入另一种格式字符串中,而在第二种情况下您没有这样做。在第一种情况下,如果这些数字中的任何一个被格式指令替换,外部格式将尝试处理它们。在第二种情况下,这不会发生。因此,我想我会建议第二种。

关于lisp - 列表中项目数量可变的格式的理由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20497611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com