Почему: else not (else) в clojure?
В Clojure вы можете написать:
(cond (= 1 2) 1
:else 5)
В схеме эквивалент будет:
(cond ((= 1 2) 1)
(else 5))
Синтаксис :else 5
не так прост, как (else 5)
. В чем причина того, что синтаксис else реализован в этом, казалось бы, непоследовательном виде в Clojure?
Ответы
Ответ 1
Я думаю, что (else 5)
менее последователен. Аргументы (cond ...)
указываются как пары условий - значений. :else value
согласован, потому что :else
- это просто соглашение - он работает, потому что :else
- это просто выражение, которое всегда истинно. Нет никаких специальных правил для :else
.
Ответ 2
:else
на самом деле немного хитроумный трюк:
-
cond
ожидает пары условие/значение - и: else - это просто значение, которое является "правдивым" в Clojure, поэтому оно гарантирует выполнение условия. (ничего, кроме нулевого или ложного, считается "истиной" ). Вы могли бы использовать ": donkey" как гарантированное истинное значение условия, если вам понравилось.
- Однако: else также передает значение читателю для человека (т.е. это условие является исполняемым, если ни одно из других условий не соответствует
Итак, это просто соглашение, которое работает в выражениях cond
и имеет смысл для читателей.
Ответ 3
Есть много причин; в первую очередь я думаю, потому что cond
реализуется как макрос вокруг if
. С другой стороны, в схеме else
есть только синоним t
в этом контексте; это не вызов функции, так почему же он выглядит как один?
Ответ 4
99% времени, parens in Clojure подразумевает функцию или вызов макроса. Это контрастирует с некоторыми другими Lisps, которые используют parens для группировки. В Clojure, если необходима группировка, например. в привязках fn
или let
вместо этого вы будете использовать []
.
Богатый обсуждает часть рассуждений о том, чтобы сделать это изменение в недавнем интервью здесь. Короче говоря, это помогает сделать код более удобным для чтения, потому что вам не нужно тратить время на выяснение того, что представляют собой parens.