[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
compiler-let and macrolet in macros
- To: Jeff Barnett <jbarnett%NRTC@USC-ECL.ARPA>
- Subject: compiler-let and macrolet in macros
- From: David A. Moon <Moon@SCRC-STONY-BROOK.ARPA>
- Date: Tue, 11 Mar 86 16:59 EST
- Cc: common-lisp@SU-AI.ARPA
- In-reply-to: The message of 10 Mar 86 22:14-EST from Jeff Barnett <jbarnett%NRTC@USC-ECL.ARPA>
Date: Mon, 10 Mar 86 19:14:01 PST
From: Jeff Barnett <jbarnett%NRTC@USC-ECL.ARPA>
Consider the following hack.
(defmacro with-car (&body body)
(defmacro with-cdr (&body body)
(defmacro right-side (exp) `(,operator ,exp))
What I want to know is will the following work
(setf (with-car (right-side foo)) (with-cdr (right-side goo)))
Probably not. Of course this can be transformed into
(with-car (setf (right-side foo) (with-cdr (right-side goo))))
However, I think the latter is more obscure.
(define-setf-method compiler-let (bindings single-body-form)
(progv (mapcar #'first bindings)
(mapcar #'eval (mapcar #'second bindings))
makes it work for me. Perhaps if I thought about it more I would come up
with a subtle reason why this works for your example but cannot work in the
most general case. Perhaps it should wrap the COMPILER-LET back around
the fourth and fifth values before returning them.
The reason define-setf-method is included in the language is precisely to
provide a portable way to do hairy things like this.
By the way, I don't believe
that an implementation of this sort using macrolet will work either.
I think it would if Common Lisp included a portable way to manipulate the function
environment in the same way that progv provides a portable way to manipulate the