我不小心想到了下面的代码:
(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/