Previous: Setting Generalized Variables, Up: Generalized Variables [Contents][Index]
setfフォームこのセクションでは、setfが操作できる新たなフォームの定義方法を説明します。
このマクロは単純なケースでsetfメソッドを簡単に定義することを可能にする。nameは関数、マクロ、スペシャルフォームの名前。nameがそれを更新するための対応するsetter関数をもつなら、このマクロを使用できる(たとえば(gv-define-simple-setter
car setcar))。
このマクロは以下のフォームの呼び出しを
(setf (name args…) value)
以下のように変換する。
(setter args… value)
このようなsetfの呼び出しはvalueをリターンするとドキュメントされている。これはcarとsetcarでは問題はない。setcarはそれがセットする値をリターンするからである。setter関数がvalueをリターンしない場合には、gv-define-simple-setterのfix-return引数に、非nil値を使用すること。これは以下のようなものに展開される
(let ((temp value)) (setter args… temp) temp)
これで正しい結果がリターンされることが保証される。
このマクロは上述のフォームより複雑なsetf展開を可能にする。たとえば呼び出すべきシンプルなsetter関数が存在しないときや、もしそれが存在してもplaceフォームとは異なる引数を要求するなら、このフォームを使う必要があるかもしれない。
このマクロは最初にsetf引数フォーム(value
args…)をarglistにバインドして、その後bodyを実行することによって、フォーム(setf
(name args…)
value)を展開する。bodyは割り当てを行うLispフォームをリターンして、最終的にはセットされた値をリターンすること。以下はこのマクロの使用例である:
(gv-define-setter caar (val x) `(setcar (car ,x) ,val))
展開をさらに制御するならマクロgv-define-expanderを参照してください。マクロgv-letplaceはsetfのような処理を行うマクロを定義するのに有用です。詳細はgv.elのソースファイルを参照してください。
Common Lispに関する注意: Common Lispは関数としての
setf、すなわち関数名がシンボルではなくリスト(setf name)であるようなsetf関数の挙動を指定するために別の方法を定義する。たとえば(defun (setf foo) …)は、setfがfooに適用されるときに使用される関数を定義する。Emacsはこれをサポートしない。適切な展開が定義されていないフォームにsetfを使用するとコンパイル時エラーとなる。Common Lispでは後で関数(setf func)が定義されるのでエラーにならない。