% Macro SETF, PSETF
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. 一般化された参照
なし。