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