[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Setf extensions (list cons values?)
- To: Info-MCL@cambridge.apple.com, pierce@uu.psi.com
- Subject: Setf extensions (list cons values?)
- From: "pierce" <vitro!pierce@uu.psi.com>
- Date: 18 Jun 91 12:00:54 U
- Priority: Normal
How can I define a (setf values) extension in MCL 2.0b2 if define-setf-method
is not required to support more than one store variable?
The behavior that I would like is:
(let (x y z w) (setf (values x y) (setf (values z w) (values 'foo 'bar))) (list
x y z w))
should return '(foo bar foo bar). Remember that the result of the setf form
needs to return multiple values as well.
Thanks for any help you can give me.
Below is some code showing what I was able to do for (setf list) and (setf
cons).
-Jonathan
(define-setf-method list (&rest references)
(let (local-vars value)
(setf local-vars (loop
for i from 1 to (length references)
collect (gensym))
value (gensym))
(values local-vars
nil;;; references
(list value)
`(apply #'(lambda (,@local-vars)
(setf
,@(loop
for local-var in local-vars
for ref in references
append `(,ref ,local-var))))
,value)
`(list ,@local-vars))))
(define-setf-method cons (car cdr)
(let (car-var cdr-var value)
(setf car-var (gensym)
cdr-var (gensym)
value (gensym))
(values (list car-var cdr-var)
nil ;;; (list car cdr)
(list value)
`(apply #'(lambda (,car-var &rest ,cdr-var) (setf ,car ,car-var
,cdr ,cdr-var))
,value)
`(cons ,car-var ,cdr-var))))