Spec-Zone.ru › Elisp

Предикаты типов

Сам интерпретатор 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.

fontp

См. Низкоуровневое представление шрифта.

frame-configuration-p

См. frame-configuration-p.

frame-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-p

См. interpreted-function-p.

keymapp

См. keymapp.

keywordp

См. Переменные, которые никогда не меняются.

listp

См. 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-p

См. window-configuration-p.

window-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 '())    ; () is nil.
     ⇒ 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

Spec-Zone.ru

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