我不小心想出了下面的代码:
(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(0 1 0 2 0 3))
但我无法解释为什么它的工作方式如此。我看到的行为是:
列表中的奇数元素似乎定义了要提供给条件的conses数。所以,在上面的形式中,它将打印出来:
;; first chance, second chance, third chance
如果用1替换零,则输出为:
(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
说实话,我错误地写了这个,我打算完全做别的事情。只是对这种行为感到困惑。
现在,如果我理解正确,~[~]
指令取决于传递的参数数量,另一方面~{~}
可能消耗可变数量的参数。那么,我看到的行为是什么,还是只是某种“未定义”的行为,当你随机和/或故意将不兼容的指令放在一起时会发生这种行为?
答案 0 :(得分:1)
据我了解,这是正确的。
~{~}
会消耗列表,直到用完为止。
~[~]
使用一个参数作为选择替代的索引。对于0和1,你得到另一个格式指令,〜:R或~S消耗列表中的额外项目。因此,结果,参数列表成对使用。
但是,对于大于1的任何东西(因为这里有冒号:~:;
),你得到的文字'none'不会消耗额外的参数。所以在最后一种情况下,列表的解析方式如下:
2 - >没有机会
1 2 - > 2次机会
2 - >没有机会
2 - >没有机会
3 - >没有机会