gpt4 book ai didi

format - 用于元素列表和子列表的 Lisp 格式字符串

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

虽然我偶尔会在 Perl 正则表达式中做梦,但 Common Lisp (CLisp) 的格式规范仍然让我有些困惑。我正在争取以下结果:

给定一个列表 ("No Match" (-2378 11 4) (-2378 11 5))我要:

| No Match| -2378 11  4| -2378 11  5|

另一端。这是我得到的:

[685]> (fss sd)

("No Match" (-2378 11 4) (-2378 11 5))
[686]> (format t "|~{~9<~a~>~2*~}~:*~{~*~{|~6d~3d~3d~}~}|" (fss sd))
| No Match| -2378 11 4
*** - There are not enough arguments left for this format directive.
Current point in control string:
"|~{~9<~a~>~2*~}~:*~{~*~{|~6d~3d~3d~}~}|"
|
The following restarts are available:
ABORT :R1 Abort main loop
Break 1 [687]> :R1

[688]>

我很高兴我已经完成了 2/3,但情况让我有点抓狂。如果我理解正确的话,|~{~9<~a~>~2*~}消耗列表的第一个元素,No Match , 然后跳过其余部分。下一部分,~:*将参数指针重置回列表的开头。然后 ~{~}包装器将我放在列表中。接下来是 ~*跳过列表中已经处理的部分。下一对~{~}输入参数的第一个子列表。第一个子列表被正确处理。然后...错误。显然我对格式的理解有问题,但我不清楚那可能是什么。

我经常觉得 CL 的其余部分非常简单,但我真的认为我们需要 CL Cookbook 中的“格式说明书”一章至少。

总而言之,这位有抱负的人需要知识渊博的追随者的帮助。帮助!

最佳答案

我逐步构建了一个解决方案。由于格式字符串只有一个参数,我首先创建了一个打印列表中每个元素的格式字符串:

CL-USER> (format t "~{|~A~}|"
'("No Match" (-2378 11 4) (-2378 11 5)))
|No Match|(-2378 11 4)|(-2378 11 5)|

现在,在第一个元素之后,我们实际上想要迭代所有剩余的参数,我们可以用 ~@{ 来完成.我在每个元素周围添加了方括号,以便我们可以看到迭代的边界。

CL-USER> (format t "~{|~A ~@{[~A]~}~}|"
'("No Match" (-2378 11 4) (-2378 11 5)))
|No Match [(-2378 11 4)][(-2378 11 5)]|

现在,方括号中的列表的每个元素都需要单独打印,因为字段宽度并不完全相同。我们可以替换初始的~A~9<~A~>现在也是。

CL-USER> (format t "~{|~9<~A~>~@{~{|~6d~3d~3d~}~}~}|"
'("No Match" (-2378 11 4) (-2378 11 5)))
| No Match| -2378 11 4| -2378 11 5|

现在(另一个答案也指出了这一点),使用 ~@紧接着是 ~{是一个可以用 ~:@{ 替换的结构,它缩短了格式字符串。

CL-USER> (format t "~{|~9<~A~>~:@{|~6d~3d~3d~}~}|"
'("No Match" (-2378 11 4) (-2378 11 5)))
| No Match| -2378 11 4| -2378 11 5|

最后,aesthetic directive, ~A 可用于指定字段宽度。 ~mincolA在右边放置空格,但是 ~mincol@A把它们放在左边,所以使用 ~<没有必要。 ~9<~A~>变成 ~9@A :

CL-USER> (format t "~{|~9@A~:@{|~6d~3d~3d~}~}|"
'("No Match" (-2378 11 4) (-2378 11 5)))
| No Match| -2378 11 4| -2378 11 5|

这种渐进式方法在 Lisp 中经常使用,先解决问题的一部分,然后再逐步完善解决方案。与具有更昂贵的编写-编译-运行周期的其他语言不同,Lisp 的快速 REPL 使这种过程变得非常容易。

如果你要用 format 做很多工作, 值得浏览 22.3 Formatted Output 部分在超规范中。大多数功能您可能在很长一段时间内都不会使用,但是在浏览了该部分之后,它们会在您需要时出现在您的脑海中。 (然后您必须查阅手册,但经常被低估的一点是,您会知道手册中有一些内容,以及在哪里可以找到它。)

关于format - 用于元素列表和子列表的 Lisp 格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17136237/

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