1

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

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

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

列表的奇数元素似乎定义了提供给条件的 conses 的数量。因此,以上面的形式,它将打印:

;; 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, 2 chance, none chance, none chance, none chance

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

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

4

1 回答 1

1

据我了解,这是正确的。

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

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

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

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

于 2012-10-18T20:17:36.420 回答