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


11.15.1 The setf Macro

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の値をreturnします。

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

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

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

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

cl-libライブラリーは、追加のsetf placeを含む、ジェネリック変数ニタイスルサマザマナ拡張を定義します。Generalized Variables in Common Lisp Extensionsを参照してください。