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