lisp - 格式化有条件的内部迭代

标签 lisp format common-lisp

我不小心想到了下面的代码:

(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(0 1 0 2 0 3))

但我无法解释为什么它会这样工作。我看到的行为是这样的:

列表中的奇数元素似乎定义了条件的条件数。因此,在上面的形式中,它将打印:

;; first chance, second chance, third chance

如果用 1 替换 0,则输出为:

(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(1 1 1 2 1 3))
;; 1 chance, 2 chance, 3 chance

不过,如果您随后喂它,您会期望:

(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(2 1 2 2 2 3))

那么你会得到3次“none chance”,但实际结果是:

;; none chance, 2 chance, none chance, none chance, none chance

老实说,我写错了,我完全打算做些别的事情。只是对这种行为感到困惑。

现在,如果我理解正确的话,~[~] 指令取决于传递的参数数量,另一方面 ~{~} 可能会消耗变量参数的数量。那么,我看到的行为是有意为之,还是只是当您随机和/或故意将不兼容的指令放在一起时发生的某种“未定义”行为?

最佳答案

据我了解,这是正确的。

~{~} 消耗列表直到用完。

~[~] 使用一个参数作为索引选择选项。对于 0 和 1,您会得到另一个格式指令 ~:R 或 ~S,它们会消耗列表中的额外项目。因此,参数列表会成对使用。

但是,对于任何大于 1 的值(因为这里有冒号:~:;),您会得到不消耗额外参数的字面值“none”。所以在最后一种情况下,列表是这样解析的:

2 -> 没有机会
1 2 -> 2 次机会
2 -> 没有机会
2 -> 没有机会
3 -> 没有机会

关于lisp - 格式化有条件的内部迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12962861/

相关文章:

parsing - 在没有所有可用包或加载所有内容的情况下从 lisp 读取/解析常见的 lisp 文件

list - 使用 lisp 将变量附加到列表列表

format - 可变格式

lambda - 返回通过将函数参数应用于等于值/谓词参数的所有元素创建的列表

lisp - 我如何使用 cl-async 在 Lisp 中检索套接字对等方的地址

vim - 关闭 Limp 中的突出显示功能

recursion - 为什么这个 lisp 函数返回 nil?

image - YUV422 到 TIFF 和 PNG 的转换给出不同的值

xml - Kotlin:格式化字符串

common-lisp - 在 Common Lisp 中获取相对路径