在迭代中格式化条件

时间:2012-10-18 20:07:01

标签: lisp format common-lisp

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

(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

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

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

1 个答案:

答案 0 :(得分:1)

据我了解,这是正确的。

~{~}会消耗列表,直到用完为止。

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

但是,对于大于1的任何东西(因为这里有冒号:~:;),你得到的文字'none'不会消耗额外的参数。所以在最后一种情况下,列表的解析方式如下:

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