Глава 6
Предикаты

 6.1 Логические значения
 6.2 Предикаты типов данных
  6.2.1 Основные предикаты
  6.2.2 Специальные предикаты
 6.3 Предикаты равенства
 6.4 Логические операторы

Предикат — это функция, которая проверяет некоторое условие переданное в аргументах и возвращает nil, если условие ложное, или не-nil, если условие истинное. Можно рассматривать, что предикат производит булево значение, где nil обозначает ложь и все остальное — истину. Условные управляющие структуры, такие как cond, if, when и unless осуществляют проверку таких булевых значений. Мы говорим, что предикат истинен, когда он возвращает не-nil значение, и ложен, когда он возвращает nil, то есть он истинен или ложен в зависимости от того, истинно или ложно проверяемое условие.

По соглашению, имена предикатов обычно заканчиваются на букву p (которая обозначает «предикат (predicate)»). Common Lisp использует единое соглашение для использования дефисов в именах предикатов. Если имя предиката создано с помощью добавления p к уже существующему имени, такому как имя типа данных, тогда дефис помещается перед последним p тогда и только тогда, когда в исходном имени были дефисы. Например, number становится numberp, но standard-char становится standard-char-p. С другой стороны, если имя предиката сформировано добавлением префиксного спецификатора в начало существующего имени предиката, то два имени соединяются с помощью дефиса, и наличие или отсутствие перед завершающим p не изменяется. Например, предикат string-lessp не содержит дефиса перед p, потому что это строковая версия lessp. Имя string-less-p было бы некорректно указывающим на то, что это предикат проверяющий тип объекта называемого string-less, а имя stringlessp имело бы смысл того, что проверяет отсутствие строк в чем-либо.

Управляющие структуры, которые проверяют булевы значения, проверяют только является или нет значение ложью (nil). Любое другое значение рассматривается как истинное. Часто предикат будет возвращать nil, в случае «неудачи» и некоторое полезное значение в случае «успеха». Такие функции могут использоваться не только для проверки, но и также для использования полезного значения, получаемого в случае успеха. Например member.

Если лучшего, чем не-nil значения, в целях указания успеха не оказалось, по соглашению в качестве «стандартного» значения истины используется символ t.