スペシャルフォーム(special form)とは、特別だとマークされたプリミティブであり、引数がすべて評価される訳ではありません。もっとも特別なフォームは制御構文の定義や変数バインディングの処理等、関数ではできないことを行ないます。
スペシャルフォームはそれぞれ、どの引数を評価して、どの引数を評価しないかについて独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。
式の最初のシンボルがスペシャルフォームなら、式はそのスペシャルフォームのルールにしたがう必要があります。それ以外ならEmacsの挙動は(たとえクラッシュしてないとしても)未定義です。たとえば((lambda
(x) x . 3)
4)
はlambda
で始まるサブ式を含みますが、これは適正なlambda
式ではないので、Emacsはエラーをシグナルするかもしれないし、3や4やnil
をリターンしたり、もしかしたら他の挙動を示すかもしれません。
この述語は引数がスペシャルフォームかをテストして、スペシャルフォームならt
、それ以外ならnil
をリターンする。
以下にEmacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスをアルファベット順でリストします。
and
see 組み合わせ条件の構築
catch
cond
see 条件
condition-case
see エラーを処理するコードの記述
defconst
see グローバル変数の定義
defvar
see グローバル変数の定義
function
see 無名関数
if
see 条件
interactive
see インタラクティブな呼び出し
lambda
see ラムダ式
let
let*
see ローカル変数
or
see 組み合わせ条件の構築
prog1
prog2
progn
see 順序
quote
see クォート
save-current-buffer
see カレントバッファー
save-excursion
see エクスカーション
save-restriction
see ナローイング
setq
see 変数の値のセット
setq-default
unwind-protect
see 非ローカル脱出
while
see 繰り返し
Common Lispに関する注意: GNU EmacsとCommon Lispのスペシャルフォームを比較する。
setq
、if
、catch
はEmacs LispとCommon Lispの両方でスペシャルフォームである。save-excursion
はEmacs Lispではスペシャルフォームだが、Common Lispには存在しない。throw
はCommon Lispではスペシャルフォーム(なぜなら複数の値をthrowできなければならない)だが、Emacs Lispでは(複数の値をもたない)関数である。