Next: , Previous: , Up: 汎変数   [Contents][Index]


4.2.1 基本的setf

setfマクロは汎変数に作用する最も基本的な方法である。

Special Form: setf [place form]…

このマクロはformを評価し、それをplaceに格納する。 placeは有効な汎変数フォームでなければならない。いくつかの placeformの対がある場合、代入はちょうどsetq のように順に行なわれる。setfは最後のformの値を戻す。

下記のLispフォームは汎変数として働くので、setfplace引数 に正しく現れてもよい:

setfへのplace引数にこれら以外のあらゆるフォームを使うと エラーを通知する。

setfマクロは適正な左から右への順序ですべての部分フォームを 評価するように注意する; たとえば、

(setf (aref vec (incf i)) i)

(incf i)を正確に一度、続くiへのアクセスの前に 評価するように見える; setfエクスパンダはaref のためにどんなsetfメソッドが定義されても実際にこのように動作することを 確実にするために、必要な一時的変数を挿入する(この場合asetが 使われるだろうが、asetは便利な順序でその 引数をとるのでそのような手段は必要ないだろう)。

しかし、placeフォームが通常ではない順序でその引数を明示的に 評価するマクロの場合、この通常ではない順序は保存される。Steeleからの 例を改作して、以下があるとすれば

(defmacro wrong-order (x y) (list 'aref y x))

フォーム(setf (wrong-order a b) 17)は、ちょうど wrong-orderへの実際の呼び出しのように、bを最初に 評価しそれからaを評価する。


Next: , Previous: , Up: 汎変数   [Contents][Index]