Next: Adding Generalized Variables, Up: Generalized Variables [Contents][Index]
setfマクロsetfマクロはジェネリック変数を操作する、もっとも基本的な方法です。setfフォームはsetqと似ていますが、シンボルだけでなく左辺の任意のplaceフォームを受け入れます。たとえば(setf
(car a) b)はaのcarをbにセットして、(setcar a
b)と同じ操作を行いますが、すべてのplace型へのセットとアクセスを行うために2つの別個の関数を覚える必要はありません。
このマクロはformを評価して、それをplaceに格納する。placeは有効なジェネリック変数フォームでなければならない。複数のplace/formペアーがある場合、割り当てはsetqの場合と同様。setfは最後のformの値をリターンする。
以下のLispフォームはジェネリック変数として機能するので、setfのplace引数にすることができます:
(setf x y)は完全に(setq x
y)と等しく、厳密に言うとsetq自体はsetfが存在するので冗長である。これは純粋にスタイルと歴史的な理由によるが、多くのプログラマーは依然として単純な変数へのセットにsetqを好む。実際にはマクロ(setf
x y)は(setq x y)に展開されるので、コンパイルされたコードでこれを使用することにパフォーマンス的な不利はない。
aref cddr symbol-function car elt symbol-plist caar get symbol-value cadr gethash cdr nth cdar nthcdr
alist-get process-get frame-parameter process-sentinel terminal-parameter window-buffer keymap-parent window-display-table match-data window-dedicated-p overlay-get window-hscroll overlay-start window-parameter overlay-end window-point process-buffer window-start process-filter default-value
どのように処理すれば良いか未知な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へのpushとpopは、リスト内の任意の位置での挿入ち削除に使用できることに注意してください。
cl-libライブラリーでは追加のsetf
placeを含む、ジェネリック変数にたいするさまざまな拡張が定義されています。Generalized Variables in Common Lisp Extensionsを参照してください。