Macro SETF, PSETF
setf {pair}* => result*
psetf {pair}* => nil
pair ::= place newvalue
place - place
newvalue - フォーム
result - 最後のplaceの格納フォームから返却された多値か、 pairがないときはnil。
setfは、placeの値をnewvalueに変更します。
(setf place newvalue)は、 newvalueの評価結果がplaceの場所へ保存されるような 更新フォームに展開されます。 いくつかのplaceフォームは、 オプションの引数を取るアクセッサを使用して実行します。 それらのオプション引数がsetfによって許可されるかどうか、 あるいはどのように使うかはsetfの展開関数次第であり、 setfの制御下にはありません。 setfの使用時に 引数&optional, &rest, …, &keyを 受け付けるような関数のドキュメントは、 どのようにそれらの引数を扱うのかを指定しなければなりません。
もし複数のpairが指定されたら、 各pairは順番に処理されます。 次の式は、
(setf place-1 newvalue-1
place-2 newvalue-2
...
place-N newvalue-N)下記の式と同等です。
(progn (setf place-1 newvalue-1)
(setf place-2 newvalue-2)
...
(setf place-N newvalue-N))psetfは複数のpairが指定されたとき、 placeへの新しい値の代入を並行に行います。 もっと正確に言うと、 全てのサブフォーム(placeとnewvalueの両方のフォーム)が 左から右に評価され、全ての評価が実行されたあとで、 全ての代入が順不同で行われます。
setfとpsetfの展開の扱いの詳細は、 5.1.2. placeの種類をご確認ください。
(setq x (cons 'a 'b) y (list 1 2 3)) => (1 2 3)
(setf (car x) 'x (cadr y) (car x) (cdr x) y) => (1 X 3)
x => (X 1 X 3)
y => (1 X 3)
(setq x (cons 'a 'b) y (list 1 2 3)) => (1 2 3)
(psetf (car x) 'x (cadr y) (car x) (cdr x) y) => NIL
x => (X 1 A 3)
y => (1 A 3) define-setf-expander, defsetf, *macroexpand-hook*
なし。
define-setf-expander, defsetf, macroexpand-1, rotatef, shiftf, 5.1. 一般化された参照
なし。