Function GET-SETF-EXPANSION
get-setf-expansion
place &optional environment
=> vars, vals, store-vars, writer-form, reader-form
place - place
environment - 環境オブジェクト
vars, vals, store-vars, writer-form, reader-form - setfの展開
environment下におけるplaceのsetfの展開を構築するための 5つの値を返却します。 5.1.1.2. Setfの展開をご確認ください。
environmentが与えられなかったか、あるいはnil
のときは、 環境はnull
のレキシカルな環境です。
get-setf-expansion 'x)
(=> NIL, NIL, (#:G0001), (SETQ X #:G0001), X
;;; これはPOPに似たマクロ
defmacro xpop (place &environment env)
(multiple-value-bind (dummies vals new setter getter)
(get-setf-expansion place env)
(let* (,@(mapcar #'list dummies vals) (,(car new) ,getter))
`(if (cdr new) (error "Can't expand this."))
(prog1 (car ,(car new))
(setq ,(car new) (cdr ,(car new)))
(
,setter))))
defsetf frob (x) (value)
(setf (car ,x) ,value)) => FROB
`(;;; 下記の例はエラー、エラーはマクロ展開時に発生する
flet ((frob (x) (cdr x))) ;不正
( (xpop (frob z)))
なし。
なし。
defsetf
, define-setf-expander
, setf
compound-formの操作f
がsetf展開を持たないなら (setf f)
のように展開されるので、 どのようなcompound-formも有効なplace
になります。