elisp: Special Forms
9.2.7 Special Forms
-------------------
A “special form” is a primitive function specially marked so that its
arguments are not all evaluated. Most special forms define control
structures or perform variable bindings—things which functions cannot
do.
Each special form has its own rules for which arguments are evaluated
and which are used without evaluation. Whether a particular argument is
evaluated may depend on the results of evaluating other arguments.
If an expression’s first symbol is that of a special form, the
expression should follow the rules of that special form; otherwise,
Emacs’s behavior is not well-defined (though it will not crash). For
example, ‘((lambda (x) x . 3) 4)’ contains a subexpression that begins
with ‘lambda’ but is not a well-formed ‘lambda’ expression, so Emacs may
signal an error, or may return 3 or 4 or ‘nil’, or may behave in other
ways.
-- Function: special-form-p object
This predicate tests whether its argument is a special form, and
returns ‘t’ if so, ‘nil’ otherwise.
Here is a list, in alphabetical order, of all of the special forms in
Emacs Lisp with a reference to where each is described.
‘and’
Combining Conditions
‘catch’
Catch and Throw
‘cond’
Conditionals
‘condition-case’
Handling Errors
‘defconst’
Defining Variables
‘defvar’
Defining Variables
‘function’
Anonymous Functions
‘if’
Conditionals
‘interactive’
Interactive Call
‘lambda’
Lambda Expressions
‘let’
‘let*’
Local Variables
‘or’
Combining Conditions
‘prog1’
‘prog2’
‘progn’
Sequencing
‘quote’
Quoting
‘save-current-buffer’
Current Buffer
‘save-excursion’
Excursions
‘save-restriction’
Narrowing
‘setq’
Setting Variables
‘setq-default’
Creating Buffer-Local
‘track-mouse’
Mouse Tracking
‘unwind-protect’
Nonlocal Exits
‘while’
Iteration
Common Lisp note: Here are some comparisons of special forms in GNU
Emacs Lisp and Common Lisp. ‘setq’, ‘if’, and ‘catch’ are special
forms in both Emacs Lisp and Common Lisp. ‘save-excursion’ is a
special form in Emacs Lisp, but doesn’t exist in Common Lisp.
‘throw’ is a special form in Common Lisp (because it must be able
to throw multiple values), but it is a function in Emacs Lisp
(which doesn’t have multiple values).