Clojure `case` не различает разные символы

Этот код работает:

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

Это тоже:

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

Это не:

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

Поиск этой ошибки в Google ведет к файлу журнала здесь. Тем не менее, парень только что сказал, что это работает с удаленными кавычками.

Похоже, что оператор case рассматривает разные символы как одно и то же значение. Почему это так?

ТИА.

1 ответ

Решение

От case документация:

Each clause can take the form of either:

test-constant result-expr

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

'- расширяется до (quote -),

Поэтому пункты в случае с кавычками расширяются до:

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

Как видите, символ "кавычка" отображается как фактическая тестовая константа, а когда вы заключаете в кавычки и +, и -, он появляется дважды.

Оценка case на фактический символ quote Могу уточнить вещи:

user=> (case 'quote '+ :plus - :minus :unknown)
:plus
user=> (case 'foo (foo +) :plus - :minus :unknown)
:plus
Другие вопросы по тегам