gpt4 book ai didi

format - 在 Common Lisp FORMAT 中,递归格式化是如何工作的

转载 作者:行者123 更新时间:2023-12-02 04:31:04 26 4
gpt4 key购买 nike

我需要生成一个字符串长度可变的空格填充字符串。不太聪明的解决方案涉及 format 的嵌套:

(format nil (format nil "~~~d,,a" 10) "asdf")

现在,我想通过使用 format~? 进行递归处理,让它变得更聪明。我希望这样的事情应该能达到我想要的效果:

(format nil "~@?" "~~~d,,a" 10 "asdf")

但我得到的只是格式化字符串,即 ~10,,a,而不是填充的 asdf 字符串。也许我在这里误解了“递归”这个词,但我希望在形成内部格式字符串后,CL 应该继续实际使用它。我错过了什么吗?

最佳答案

格式指令的变量参数

FORMAT 允许您使用 v 作为控制字符串中指令的参数,以从参数列表中弹出参数。

CL-USER> (format nil "~va" 10 "asdf")
"asdf "

可能使用多个v

CL-USER> (format nil "~v,,,va" 10 #\- "asdf")
"asdf------"

使用~?进行递归处理

递归处理指令用于在控制字符串内嵌入对 FORMAT 的不同“调用”。例如,可以用它来实现提示是或否答案的功能。

(defun y-or-n-prompt (control-string &rest args)
(format t "~&~? [y/n]: " control-string args)
;;...
)

调用者现在可以使用此格式设置提示,就像使用 FORMAT 一样,而不必担心提示对用户来说应该是什么样子的细节(在开头添加新行或末尾的 [y/n]: 提示)。

CL-USER> (y-or-n-prompt "foo ~d bar" 12)
foo 12 bar [y/n]:
NIL

~?的结果不会被FORMAT处理,因此不能用于构建控制字符串。一般来说,在运行时构建控制字符串是一个坏主意,因为它很容易出错(例如,您必须转义字符串中任何不需要的波浪号)并阻止实现在编译时处理控制字符串。

关于format - 在 Common Lisp FORMAT 中,递归格式化是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868555/

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