Next: , Previous: , Up: フォームの種類   [Contents][Index]


10.2.7 スペシャルフォーム

スペシャルフォーム(special form)とは、特別だとマークされたプリミティブであり、引数がすべて評価される訳ではありません。もっとも特別なフォームは制御構文の定義や変数バインディングの処理等、関数ではできないことを行ないます。

スペシャルフォームはそれぞれ、どの引数を評価して、どの引数を評価しないかについて独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。

式の最初のシンボルがスペシャルフォームなら、式はそのスペシャルフォームのルールにしたがう必要があります。それ以外ならEmacsの挙動は(たとえクラッシュしてないとしても)未定義です。たとえば((lambda (x) x . 3) 4)lambdaで始まるサブ式を含みますが、これは適正なlambda式ではないので、Emacsはエラーをシグナルするかもしれないし、3や4やnilをリターンしたり、もしかしたら他の挙動を示すかもしれません。

Function: special-form-p object

この述語は引数がスペシャルフォームかをテストして、スペシャルフォームならt、それ以外ならnilをリターンする。

以下にEmacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスをアルファベット順でリストします。

and

see 組み合わせ条件の構築

catch

see 明示的な非ローカル脱出: catchthrow

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

see バッファーローカルなバインディングの作成と削除

unwind-protect

see 非ローカル脱出

while

see 繰り返し

Common Lispに関する注意: GNU EmacsとCommon Lispのスペシャルフォームを比較する。setqifcatchはEmacs LispとCommon Lispの両方でスペシャルフォームである。save-excursionはEmacs Lispではスペシャルフォームだが、Common Lispには存在しない。throwはCommon Lispではスペシャルフォーム(なぜなら複数の値をthrowできなければならない)だが、Emacs Lispでは(複数の値をもたない)関数である。