Next: Autoloading, Previous: Macro Forms, Up: Forms [Contents][Index]
スペシャルフォーム(special form)とは、特別だとマークされたプリミティブ関数であり、その引数のすべては評価されません。もっとも特別なフォームは制御構文の定義や変数バインディングの処理等、関数ではできないことを行ないます。
スペシャルフォームはそれぞれ、どの引数を評価して、どの引数を評価しないかについて独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。
式の最初のシンボルがスペシャルフォームなら、式はそのスペシャルフォームのルールにしたがう必要があります。それ以外ならEmacsの挙動は(たとえクラッシュしなくいとしても)未定義です。たとえば((lambda
(x) x . 3)
4)
はlambda
で始まるサブ式を含みますが、これは適正なlambda
式ではないので、Emacsはエラーをシグナルするかもしれないし、3や4やnil
をリターンしたり、もしかしたら他の挙動を示すかもしれません。
この述語は引数がスペシャルフォームかをテストして、スペシャルフォームならt
、それ以外ならnil
をリターンする。
以下にEmacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスをアルファベット順でリストします。
and
catch
see Catch and Throw
cond
see Conditionals
condition-case
see Handling Errors
defconst
defvar
function
if
see Conditionals
interactive
see Interactive Call
lambda
let
let*
see Local Variables
or
prog1
prog2
progn
see Sequencing
quote
see Quoting
save-current-buffer
see Current Buffer
save-excursion
see Excursions
save-restriction
see Narrowing
setq
setq-default
track-mouse
see Mouse Tracking
unwind-protect
see Nonlocal Exits
while
see Iteration
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では(複数の値をもたない)関数である。