Clojure (или Lisp) эквивалент сложного булева теста - PullRequest
21 голосов
/ 11 февраля 2009

В C ++ я бы написал что-то вроде этого:

if (a == something && b == anotherthing)
{
   foo();
}

Правильно ли я считаю, что эквивалент Clojure выглядит примерно так:

(if (= a something)
    (if (= b anotherthing)
        (foo)))

Или есть другой способ выполнить логическое "и", которое я пропустил? Как я уже сказал, последняя форма, кажется, работает правильно - мне просто интересно, есть ли какой-нибудь более простой способ выполнить логическое и. И поиск «логических», «логических» и «и» в Clojure Google Group дал слишком много результатов, чтобы их можно было использовать.

Ответы [ 4 ]

35 голосов
/ 11 февраля 2009

В Common Lisp и Схеме

(and (= a something) (= b another) (foo))
17 голосов
/ 11 февраля 2009

В Common Lisp следующее также является обычной идиомой:

(when (and (= a something) (= b another))
  (foo))

Сравните это с ответом Дуга Карри, используя (and ... (foo)). Семантика одна и та же, но в зависимости от типа возвращаемого значения (foo), большинство программистов на Common Lisp предпочтут одно другому:

  • Используйте (and ... (foo)) в случаях, когда (foo) возвращает логическое значение.

  • Используйте (when (and ...) (foo)) в случаях, когда (foo) возвращает произвольный результат.

Исключением, подтверждающим правило, является код, в котором программист знает обе идиомы, но намеренно пишет (and ... (foo)) в любом случае. : -)

8 голосов
/ 29 октября 2010

В Clojure я обычно использовал бы что-то вроде:

(if 
  (and (= a something) (= b anotherthing))
  (foo))

Очевидно, что можно быть более кратким (например, ответ Дуга), но я думаю, что этот подход более естественен для чтения людьми, особенно если у будущих читателей кода будет C ++ или Java фон!

2 голосов
/ 29 октября 2010

Это действительно круто! (and x y) - это макрос - вы можете проверить исходный код на clojure.org - который расширяется до (if x y false), эквивалентного:

if (x) {
  if (y) {
    ...
  }
} else {
  false
}

(or x y) аналогично, но перевернуто.

...