Подтвердить что ты не робот

Почему: else not (else) в clojure?

В Clojure вы можете написать:

(cond (= 1 2) 1 
      :else 5)

В схеме эквивалент будет:

(cond ((= 1 2) 1)
       (else 5))

Синтаксис :else 5 не так прост, как (else 5). В чем причина того, что синтаксис else реализован в этом, казалось бы, непоследовательном виде в Clojure?

4b9b3361

Ответ 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.