почему: иначе (не) в ближайшем будущем? - PullRequest
24 голосов
/ 12 июня 2011

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

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

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

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

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

Ответы [ 4 ]

36 голосов
/ 12 июня 2011

:else на самом деле немного хитрый трюк здесь:

  • cond ожидает пары условие / значение - и: else - это просто значение , которое является "правдивым" в Clojure, поэтому оно гарантирует выполнение условия. (все, кроме null или false, считается «правдой»). Вы также можете использовать «: donkey» в качестве гарантированного истинного значения условия, если хотите.
  • Однако: еще также передает значение для читателя-человека (т.е. это условие выполняется, если ни одно из других условий не соответствует

Так что на самом деле это просто соглашение, которое работает в cond выражениях и имеет смысл для читателей-людей.

27 голосов
/ 12 июня 2011

Я думаю (else 5) менее последовательный. (cond ...) аргументы указаны как пары условие - значение. :else value согласуется, потому что :else - это просто соглашение - оно работает, потому что :else - это просто выражение, которое всегда верно. Для :else вообще нет особых правил.

3 голосов
/ 12 июня 2011

99% времени, парены в Clojure подразумевают вызов функции или макроса.Это в отличие от некоторых других Лиспов, которые используют скобки для группировки.В Clojure, если группировка необходима, например, в привязках fn или let, вы будете использовать вместо нее [].

Рич обсуждает часть причин, по которым было сделано это изменение в недавнем интервью здесь .Короче говоря, это помогает сделать код более читабельным, поскольку вам не нужно тратить время на выяснение того, что представляют собой символы скобок.

3 голосов
/ 12 июня 2011

Есть много причин;в первую очередь я думаю, это потому, что cond реализован как макрос около if.С другой стороны, в схеме else является просто синонимом для t в этом контексте;это не вызов функции, так почему же он выглядит так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...