Clojure`case`不区分不同的符号

for*_*tyj 3 case clojure

此代码有效:

(case '-
    + :plus
    - :minus
    :unknown)
==> :minus
Run Code Online (Sandbox Code Playgroud)

这个也是:

(case '-
    + :plus
    '- :minus
    * :times
    :unknown)
==> :minus
Run Code Online (Sandbox Code Playgroud)

这不是:

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

谷歌搜索此错误导致日志文件在这里.然而,这个家伙只是说它删除了引号.

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

TIA.

svk*_*svk 5

case文档:

Each clause can take the form of either:

test-constant result-expr

(test-constant1 ... test-constantN)  result-expr
Run Code Online (Sandbox Code Playgroud)

'-扩展到(quote -).

因此,带引号的条款扩展为:

(quote -) :minus
(quote +) :plus
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,符号"quote"显示为实际测试常量,当您引用+和 - 时,它会出现两次.

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

user=> (case 'quote '+ :plus - :minus :unknown)
:plus
user=> (case 'foo (foo +) :plus - :minus :unknown)
:plus
Run Code Online (Sandbox Code Playgroud)

  • 为了实现你想要的,你应该使用`(condp = +, + :plus, - :minus)` (2认同)