gpt4 book ai didi

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

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

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

(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/

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