Next: 自動ロード, Previous: Lispマクロの評価, Up: フォームの種類 [Contents][Index]
スペシャルフォーム(special form)とは、特別だとマークされたプリミティブであり、引数がすべて評価される訳ではありません。もっとも特別なフォームは制御構文の定義や変数バインディングの処理等、関数ではできないことを行ないます。
スペシャルフォームはそれぞれ、どの引数を評価して、どの引数を評価しないかについて独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。
式の最初のシンボルがスペシャルフォームなら、式はそのスペシャルフォームのルールにしたがう必要があります。それ以外ならEmacsの挙動は(たとえクラッシュしてないとしても)未定義です。たとえば((lambda
(x) x . 3)
4)はlambdaで始まるサブ式を含みますが、これは適正なlambda式ではないので、Emacsはエラーをシグナルするかもしれないし、3や4やnilをリターンしたり、もしかしたら他の挙動を示すかもしれません。
この述語は引数がスペシャルフォームかをテストして、スペシャルフォームならt、それ以外ならnilをリターンする。
以下にEmacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスをアルファベット順でリストします。
andsee 組み合わせ条件の構築
catchcondsee 条件
condition-casesee エラーを処理するコードの記述
defconstsee グローバル変数の定義
defvarsee グローバル変数の定義
functionsee 無名関数
ifsee 条件
interactivesee インタラクティブな呼び出し
lambdasee ラムダ式
letlet*see ローカル変数
orsee 組み合わせ条件の構築
prog1prog2prognsee 順序
quotesee クォート
save-current-buffersee カレントバッファー
save-excursionsee エクスカーション
save-restrictionsee ナローイング
setqsee 変数の値のセット
setq-defaultunwind-protectsee 非ローカル脱出
whilesee 繰り返し
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では(複数の値をもたない)関数である。