3

此代码有效:

(case '-
    + :plus
    - :minus
    :unknown)
==> :minus

这个也是:

(case '-
    + :plus
    '- :minus
    * :times
    :unknown)
==> :minus

这不会:

(case '-
    '+ :plus
    '- :minus
    * :times
    :unknown)
==> java.lang.IllegalArgumentException: Duplicate case test constant: quote

谷歌搜索这个错误会导致日志文件在这里。然而,这家伙只是说它在去掉引号的情况下工作。

看起来 case 语句将不同的符号视为相同的值。为什么会这样?

TIA。

4

1 回答 1

5

case文档中:

Each clause can take the form of either:

test-constant result-expr

(test-constant1 ... test-constantN)  result-expr

'-扩展到(quote -).

因此,带引号的情况下的子句扩展为:

(quote -) :minus
(quote +) :plus

正如你所看到的,符号“quote”作为一个实际的测试常量出现,当你同时引用 + 和 - 时,它出现了两次。

评估case实际符号上的quote可能会澄清一些事情:

user=> (case 'quote '+ :plus - :minus :unknown)
:plus
user=> (case 'foo (foo +) :plus - :minus :unknown)
:plus
于 2013-10-04T12:41:42.573 回答