10.2.7 Специальные формы

Специальная форма — это примитив, специально помеченный таким образом, что его аргументы не вычисляются полностью. Большинство специальных форм определяют структуры управления или выполняют привязки переменных — то, что функции не могут делать.

Каждая специальная форма имеет свои правила относительно того, какие аргументы вычисляются, а какие используются без вычисления. То, будет ли определенный аргумент вычислен, может зависеть от результатов вычисления других аргументов.

Если первый символ выражения является символом специальной формы, то выражение должно следовать правилам этой специальной формы; в противном случае поведение Emacs не определено (хотя оно не вызовет сбой). Например, ((lambda (x) x . 3) 4) содержит подвыражение, начинающееся с lambda, но не являющееся корректным выражением lambda, поэтому Emacs может сообщить об ошибке, вернуть 3 или 4 или nil, или вести себя по-другому.

Функция: special-form-p object

Этот предикат проверяет, является ли его аргумент специальной формой, и возвращает t в случае успеха, nil в противном случае.

Ниже приведен список, в алфавитном порядке, всех специальных форм в Emacs Lisp с указанием места их описания.

and

см. Конструкции для объединения условий

catch

см. Явные нелокальные выходы: catch и throw

cond

см. Условные операторы

condition-case

см. Написание кода для обработки ошибок

defconst

см. Определение глобальных переменных

defvar

см. Определение глобальных переменных

function

см. Анонимные функции

if

см. Условные операторы

interactive

см. Интерактивный вызов

lambda

см. Лямбда-выражения

let
let*

см. Локальные переменные

or

см. Конструкции для объединения условий

prog1
prog2
progn

см. Последовательность

quote

см. Кавычирование

save-current-buffer

см. Текущий буфер

save-excursion

см. Экскурсии

save-restriction

см. Сужение

setq

см. Установка значений переменных

setq-default

см. Создание и удаление локальных привязок буфера

unwind-protect

см. Нелокальные выходы

while

см. Итерация

Примечание 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 (который не имеет множественных значений).