Spec-Zone.ru › Elisp

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

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

keymapp

См. keymapp.

keywordp

См. Постоянные переменные.

listp

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

См. window-configuration-p.

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

Spec-Zone.ru

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