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


12.17.1 setfマクロ

setfマクロはジェネリック変数を操作するもっとも基本的な方法です。setfフォームはsetqと似ていますが、シンボルだけでなく左辺の任意のplace formを受け入れます。たとえば(setf (car a) b)aのcarをbにセットして(setcar a b)と同じ操作を行いますが、このタイプのplaceにセットやアクセスするために2つの関数を個別に覚える必要はありません。

Macro: setf [place form]…

このマクロはformを評価して、それをplaceに格納する。placeは有効なジェネリック変数フォームでなければならない。複数のplace/formペアーがある場合、割り当てはsetqの場合と同様。setfは最後のformの値をリターンする。

以下のLispフォームはEmacsではジェネリック変数として機能するフォームなので、setfplace引数にすることができます:

どのように処理すれば良いか未知なplaceフォームを渡すと、setfはエラーをシグナルします。

nthcdrの場合、関数のリスト引数はそれ自体が有効なplaceフォームでなければならないことに注意してください。たとえば(setf (nthcdr 0 foo) 7)は、foo自体に7をセットするでしょう。

マクロpush(List Variablesを参照)とpop(List Elementsを参照)は、リストだけでなくジェネリック変数を操作できます。(pop place)place内に格納されたリストの最初の要素を削除してリターンします。これは(prog1 (car place) (setf place (cdr place)))と似ていますが、すべてのサブフォームを一度だけ評価します。(push x place)place内に格納されたリストの1番前にxを挿入します。これは(setf place (cons x place))と似ていますが、サブフォームの評価が異なります。nthcdr placeへのpushpopは、リスト内の任意の位置での挿入ち削除に使用できることに注意してください。

cl-libライブラリーでは追加のsetf placeを含む、ジェネリック変数にたいするさまざまな拡張が定義されています。Generalized Variables in Common Lisp Extensionsを参照してください。