![[LISPWORKS]](../Graphics/LWSmall.gif)
![[Common Lisp HyperSpec (TM)]](../Graphics/CLHS_Sm.gif) 
 ![[Previous]](../Graphics/Prev.gif)
![[Up]](../Graphics/Up.gif)
![[Next]](../Graphics/Next.gif)
Syntax:
get-setf-expansion place &optional environment
=> vars, vals, store-vars, writer-form, reader-form
Arguments and Values:
place---a place.
environment---an environment object.
vars, vals, store-vars, writer-form, reader-form---a setf expansion.
Description:
Determines five values constituting the setf expansion for place in environment; see Section 5.1.1.2 (Setf Expansions).
If environment is not supplied or nil, the environment is the null lexical environment.
Examples:
(get-setf-expansion 'x) => NIL, NIL, (#:G0001), (SETQ X #:G0001), X
;;; This macro is like 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
;;; The following is an error; an error might be signaled at macro expansion time
 (flet ((frob (x) (cdr x)))  ;Invalid
   (xpop (frob z)))
 
  
Affected By: None.
Exceptional Situations: None.
See Also:
defsetf, define-setf-expander, setf
Notes:
Any compound form is a valid place, since any compound form whose operator f has no setf expander are expanded into a call to (setf f).
![[Starting Points]](../Graphics/StartPts.gif)
![[Contents]](../Graphics/Contents.gif)
![[Index]](../Graphics/Index.gif)
![[Symbols]](../Graphics/Symbols.gif)
![[Glossary]](../Graphics/Glossary.gif)
![[Issues]](../Graphics/Issues.gif)