【问题标题】:Format conditional inside iteration在迭代中设置条件格式
【发布时间】:2012-10-18 20:07:00
【问题描述】:

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

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

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

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

;; first chance, second chance, third chance

如果你用一替换零,那么输出是:

(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

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

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

【问题讨论】:

    标签: lisp format common-lisp


    【解决方案1】:

    据我了解,这是正确的。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      相关资源
      最近更新 更多