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
(-2 newvalue-2
place
... 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 1 X 3)
x => (1 X 3)
y 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 1 A 3)
x => (1 A 3) y
define-setf-expander
, defsetf
, *macroexpand-hook*
なし。
define-setf-expander
, defsetf
, macroexpand-1
, rotatef
, shiftf
, 5.1. 一般化された参照
なし。