Специальная форма — это примитив, специально помеченный таким образом, что его аргументы не вычисляются полностью. Большинство специальных форм определяют структуры управления или выполняют привязки переменных — то, что функции не могут делать.
Каждая специальная форма имеет свои правила относительно того, какие аргументы вычисляются, а какие используются без вычисления. То, будет ли определенный аргумент вычислен, может зависеть от результатов вычисления других аргументов.
Если первый символ выражения является символом специальной формы, то
выражение должно следовать правилам этой специальной формы; в противном
случае поведение Emacs не определено (хотя оно не вызовет сбой). Например,
((lambda (x) x . 3) 4) содержит подвыражение, начинающееся с
lambda, но не являющееся корректным выражением lambda,
поэтому Emacs может сообщить об ошибке, вернуть 3 или 4 или
nil, или вести себя по-другому.
Этот предикат проверяет, является ли его аргумент специальной формой,
и возвращает t в случае успеха, nil
в противном случае.
Ниже приведен список, в алфавитном порядке, всех специальных форм в Emacs Lisp с указанием места их описания.
andcatchcondcondition-casedefconstdefvarfunctionifinteractivelambdaсм. Лямбда-выражения
letlet*orprog1prog2prognquoteсм. Кавычирование
save-current-bufferсм. Текущий буфер
save-excursionсм. Экскурсии
save-restrictionсм. Сужение
setqsetq-defaultunwind-protectwhileсм. Итерация
Примечание Common Lisp: Вот некоторые сравнения специальных форм в GNU Emacs Lisp и Common Lisp.
setq,ifиcatchявляются специальными формами как в Emacs Lisp, так и в Common Lisp.save-excursionявляется специальной формой в Emacs Lisp, но не существует в Common Lisp.throwявляется специальной формой в Common Lisp (поскольку он должен уметь выбрасывать несколько значений), но это функция в Emacs Lisp (который не имеет множественных значений).