Next: Adding Generalized Variables, Up: Generalized Variables [Contents][Index]
setf
Macrosetf
マクロは、ジェネリック変数を操作する、もっとも基本的な方法です。setf
フォームはsetq
と似ていますが、シンボルだけでなく、左辺の任意のplace
formを受け入れます。たとえば(setf (car a)
b)
はa
のcarをb
にセットして、(setcar a
b)
と同じ操作を行いますが、すべてのplaceのタイプにセットおよびアクセスするために2つの別個の関数を覚える必要はありません。
このマクロはformを評価して、それをplaceに格納します。placeは有効なジェネリック変数フォームでなければなりません。複数のplace/formペアーがある場合、割り当てはsetq
のときと同様です。setf
は最後のformの値をreturnします。
以下の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
default-value 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
どのように処理すれば良いか知られていない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を参照してください。