Next: , Up: ジェネリック変数   [Contents][Index]


12.17.1 setfマクロ

setfマクロはジェネリック変数を操作するもっとも基本的な方法です。setfフォームはsetqと似ていますが、シンボルだけでなくそれぞれのペアーの1つ目(左)の任意の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(リスト変数の変更を参照)とpop(リスト要素へのアクセスを参照)は、リストだけでなくジェネリック変数を操作できます。(pop place)place内に格納されたリストの最初の要素を削除してリターンします。これは(prog1 (car place) (setf place (cdr place)))と似ていますが、すべてのサブフォームを一度だけ評価します。(push x place)place内に格納されたリストの一番前にxを挿入します。これは(setf place (cons x place))と似ていますが、サブフォームの評価が異なります。nthcdr placeへのpushpopは、リスト内の任意の位置での挿入や削除に使用できることに注意してください。

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