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