Spec-Zone.ru › Elisp

Конструкции для объединения условий

В этом разделе описываются конструкции, которые часто используются вместе с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API