npt-japanese

% Macro SETF, PSETF

UP


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への新しい値の代入を並行に行います。 もっと正確に言うと、 全てのサブフォーム(placenewvalueの両方のフォーム)が 左から右に評価され、全ての評価が実行されたあとで、 全ての代入が順不同で行われます。

setfpsetfの展開の扱いの詳細は、 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. 一般化された参照

備考

なし。


TOP, Github