Предикаты типов
Сам интерпретатор Emacs Lisp не выполняет проверки типов фактических аргументов, передаваемых функциям при вызове. Он не может этого сделать, так как аргументы функций в Lisp не имеют объявленных типов данных, в отличие от других языков программирования. Поэтому каждая функция должна самостоятельно проверять, относится ли каждый фактический аргумент к типу, который функция может использовать.
Все встроенные функции проверяют типы своих фактических аргументов при необходимости и сигнализируют об ошибке wrong-type-argument если аргумент имеет неправильный тип. Например, вот что происходит, если вы передаете аргумент в +, с которым он не может справиться:
(+ 2 'a)
error→ Wrong type argument: number-or-marker-p, a
Если вы хотите, чтобы ваша программа по-разному обрабатывала разные типы, вы должны выполнять явную проверку типов. Наиболее распространённый способ проверки типа объекта — вызов функции предиката типа. В Emacs есть предикат типа для каждого типа, а также некоторые предикаты для комбинаций типов.
Функция предиката типа принимает один аргумент; она возвращает t если аргумент принадлежит соответствующему типу и nil в противном случае. В соответствии с общей лисп-конвенцией для функций-предикатов, большинство имён предикатов типов оканчиваются на «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-
См. floatp.
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.
commandp-
См. commandp.
condition-variable-p-
См. condition-variable-p.
consp-
См. consp.
custom-variable-p-
См. custom-variable-p.
fixnump-
См. floatp.
floatp-
См. floatp.
fontp-
См. Шрифт низкого уровня.
frame-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.
keymapp-
См. keymapp.
keywordplistp-
См. listp.
markerp-
См. markerp.
mutexp-
См. mutexp.
nlistp-
См. nlistp.
number-or-marker-p-
См. number-or-marker-p.
numberp-
См. numberp.
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 объект
-
Эта функция возвращает символ, обозначающий примитивный тип объекта. Значение является одним из символов
bool-vector,buffer,char-table,compiled-function,condition-variable,cons,finalizer,float,font-entity,font-object,font-spec,frame,hash-table,integer,marker,mutex,overlay,process,string,subr,symbol,thread,vector,window, илиwindow-configuration. Однако, если объект является записью, возвращается тип, указанный в его первом слоте; Записи.(type-of 1) ⇒ integer(type-of 'nil) ⇒ symbol (type-of '()) ;()isnil. ⇒ symbol (type-of '(x)) ⇒ cons (type-of (record 'foo)) ⇒ foo
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/Type-Predicates.html