Конструкции для объединения условий
В этом разделе описываются конструкции, которые часто используются вместе с if и cond для выражения сложных условий. Конструкции and и or также могут использоваться по отдельности как виды многоуровневых условных конструкций.
- Функция: not condition
Эта функция проверяет ложность condition. Она возвращает
tесли condition являетсяnil, иnilв противном случае. Функцияnotидентичнаnull, и мы рекомендуем использовать имяnullпри проверке на пустой список.
- Специальная форма: and conditions…
-
Специальная форма
andпроверяет, истинны ли все conditions. Она работает путем последовательной оценки conditions в порядке их написания.Если какое-либо из conditions оценивается как
nil, то результатandдолжен бытьnilнезависимо от оставшихся conditions; поэтомуandвозвращаетnilсразу же, игнорируя оставшиеся conditions.Если все conditions оказываются не-
nil, то значение последнего из них становится значением формыand. Просто(and), без conditions, возвращаетt, что уместно, поскольку все conditions оказались не-nil. (Подумайте об этом; какая из них не была?)Вот пример. Первое условие возвращает целое число 1, которое не является
nil. Аналогично, второе условие возвращает целое число 2, которое не являетсяnil. Третье условие являетсяnil, поэтому оставшееся условие никогда не оценивается.(and (print 1) (print 2) nil (print 3)) -| 1 -| 2 ⇒ nilВот более реалистичный пример использования
and:(if (and (consp foo) (eq (car foo) 'x)) (message "foo is a list starting with x"))Обратите внимание, что
(car foo)не выполняется, если(consp foo)возвращаетnil, тем самым избегая ошибки.Выражения
andтакже можно записать, используя либоif, либоcond. Вот как:(and arg1 arg2 arg3) ≡ (if arg1 (if arg2 arg3)) ≡ (cond (arg1 (cond (arg2 arg3))))
- Специальная форма: or conditions…
-
Специальная форма
orпроверяет, истинно ли хотя бы одно из conditions. Она работает путем последовательной оценки всех conditions в порядке их написания.Если какое-либо из conditions оценивается как значение, отличное от
nil, то результатorдолжен быть отличным отnil; поэтомуorвозвращается сразу, игнорируя оставшиеся conditions. Возвращаемое значение — это значение, отличное отnilтолько что оцененного условия.Если все conditions оказываются
nil, то выражениеorвозвращаетnil. Просто(or), без conditions, возвращаетnil, что уместно, так как все conditions оказалисьnil. (Подумайте об этом; какая из них не была?)Например, это выражение проверяет, является ли
xлибоnil, либо целым числом ноль:(or (eq x nil) (eq x 0))
Как и конструкция
and, конструкцияorможет быть записана в терминахcond. Например:(or arg1 arg2 arg3) ≡ (cond (arg1) (arg2) (arg3))Можно было бы почти записать
orв терминахif, но не совсем:(if arg1 arg1 (if arg2 arg2 arg3))Это не полностью эквивалентно, потому что оно может оценивать arg1 или arg2 дважды. В отличие от
(or arg1 arg2 arg3),(or arg1 arg2 arg3)никогда не оценивает аргумент более одного раза.
- Функция: xor condition1 condition2
-
Эта функция возвращает булево исключающее ИЛИ condition1 и condition2. То есть,
xorвозвращаетnilесли оба аргумента являютсяnil, или оба являются не-nil. В противном случае возвращается значение того аргумента, который является не-nil.Обратите внимание, что в отличие от
or, оба аргумента всегда оцениваются.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Combining-Conditions.html