Previous: , Up: Generalized Variables   [Contents][Index]


11.15.2 Defining new setf forms

このセクションでは、setfが操作できる新たなフォームを定義する方法を説明します。

Macro: gv-define-simple-setter name setter &optional fix-return

このマクロは、単純なケースにたいしてsetfメソッドを簡単に定義することを可能にします。nameは、関数、マクロ、スペシャルフォームの名前です。nameが、それを更新するための対応するsetter関数をもつときは、このマクロを使用できます(たとえば(gv-define-simple-setter car setcar))。

このマクロをフォーム以下の呼び出しを

(setf (name args…) value)

以下のように変換します。

(setter argsvalue)

setfのような呼び出しは、valueをreturnするようにドキュメントされます。これに問題はありません。たとえばcarsetcarでは、setcarはそれがセットする値をreturnするからです。setter関数がvalueをreturnしない場合は、gv-define-simple-setterfix-return引数に、非nil値を使用してください。これは以下のようなものに展開されます

(let ((temp value))
  (setter args… temp)
  temp)

これで正しい結果がreturnされることが保証されます。

Macro: gv-define-setter name arglist &rest body

このマクロは、上述のフォームより複雑な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) …)は、setffooに適用されるときに使用される関数を定義します。Emacsはこれをサポートしません。適切な展開が定義されていないフォームにsetfを使用すると、コンパイル時にエラーとなります。Common Lispでは、関数(setf func)が後で定義されるので、エラーにはなりません。