Предикаты типов
Сам интерпретатор Emacs Lisp не выполняет проверку типов фактических аргументов, передаваемых функциям при вызове. Он не мог бы этого делать, поскольку аргументы функций в Lisp не имеют объявленных типов данных, как в других языках программирования. Поэтому каждая функция должна сама проверять, принадлежит ли каждый фактический аргумент к типу, с которым она может работать.
Все встроенные функции при необходимости проверяют типы фактических аргументов и сигнализируют об ошибке wrong-type-argument, если аргумент имеет неверный тип. Например, вот что происходит, если передать функции + аргумент, с которым она не может работать:
(+ 2 'a)
error→ Wrong type argument: number-or-marker-p, a
Если вы хотите, чтобы ваша программа по-разному обрабатывала объекты разных типов, необходимо явно проверять их типы. Самый распространённый способ проверить тип объекта — вызвать функцию предиката типа. В Emacs есть предикат типа для каждого типа, а также несколько предикатов для комбинаций типов.
Функция-предикат типа принимает один аргумент; она возвращает t, если аргумент принадлежит к соответствующему типу, и nil в противном случае. Согласно общепринятому в Lisp соглашению об именовании функций-предикатов, имена большинства предикатов типа оканчиваются на «p».
Вот пример, в котором предикат listp используется для проверки того, что объект является списком, а symbolp — для проверки того, что объект является символом.
(defun add-on (x)
(cond ((symbolp x)
;; If X is a symbol, put it on LIST.
(setq list (cons x list)))
((listp x)
;; If X is a list, add its elements to LIST.
(setq list (append x list)))
(t
;; We handle only symbols and lists.
(error "Invalid argument %s in add-on" x))))
Ниже приведена таблица предопределённых предикатов типов в алфавитном порядке со ссылками на дополнительную информацию.
atom-
См. atom.
arrayp-
См. arrayp.
bignump-
См. bignump.
bool-vector-p-
См. bool-vector-p.
booleanp-
См. booleanp.
bufferp-
См. bufferp.
byte-code-function-p-
См. byte-code-function-p.
case-table-p-
См. case-table-p.
char-or-string-p-
См. char-or-string-p.
char-table-p-
См. char-table-p.
closurep-
См. closurep.
commandp-
См. commandp.
compiled-function-p-
См. compiled-function-p.
condition-variable-p-
См. condition-variable-p.
consp-
См. consp.
custom-variable-p-
См. custom-variable-p.
fixnump-
См. fixnump.
floatp-
См. floatp.
fontpframe-configuration-pframe-live-p-
См. frame-live-p.
framep-
См. framep.
functionp-
См. functionp.
hash-table-p-
См. hash-table-p.
integer-or-marker-p-
См. integer-or-marker-p.
integerp-
См. integerp.
interpreted-function-pkeymapp-
См. keymapp.
keywordplistp-
См. listp.
markerp-
См. markerp.
mutexp-
См. mutexp.
nlistp-
См. nlistp.
number-or-marker-p-
См. number-or-marker-p.
numberp-
См. numberp.
obarrayp-
См. obarrayp.
overlayp-
См. overlayp.
processp-
См. processp.
recordp-
См. recordp.
sequencep-
См. sequencep.
string-or-null-p-
См. string-or-null-p.
stringp-
См. stringp.
subrp-
См. subrp.
symbolp-
См. symbolp.
syntax-table-p-
См. syntax-table-p.
threadp-
См. threadp.
vectorp-
См. vectorp.
wholenump-
См. wholenump.
window-configuration-pwindow-live-p-
См. window-live-p.
windowpСм. windowp.
Наиболее общий способ проверить тип объекта — вызвать функцию type-of. Напомним, что каждый объект принадлежит только одному примитивному типу; type-of сообщает, к какому именно (см. Типы данных Lisp). Однако type-of ничего не знает о непримитивных типах. В большинстве случаев предпочтительнее использовать предикаты типов, а не type-of.
- Функция: type-of object
-
Эта функция возвращает символ, обозначающий примитивный тип object. Значением является один из символов
bool-vector,buffer,char-table,compiled-function,condition-variable,cons,finalizer,float,font-entity,font-object,font-spec,frame,hash-table,integer,marker,mutex,obarray,overlay,process,string,subr,symbol,thread,vector,windowилиwindow-configuration. Однако, если object — запись, возвращается тип, указанный в её первом слоте; см. Записи.(type-of 1) ⇒ integer(type-of 'nil) ⇒ symbol (type-of '()) ;()isnil. ⇒ symbol (type-of '(x)) ⇒ cons (type-of (record 'foo)) ⇒ foo
- Функция: cl-type-of object
-
Эта функция возвращает символ, обозначающий точный тип object. Обычно она ведёт себя как
type-of, за исключением того, что гарантированно возвращает наиболее точный тип. Это также означает, что конкретный возвращаемый тип может меняться в зависимости от версии Emacs. Поэтому, как правило, не следует сравнивать возвращаемое значение с каким-либо фиксированным набором типов.(cl-type-of 1) ⇒ fixnum(cl-type-of 'nil) ⇒ null (cl-type-of (record 'foo)) ⇒ foo
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Type-Predicates.html