[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gcl-devel] PSETQ and SYMBOL-MACROLET interaction
From: |
Paul F. Dietz |
Subject: |
[Gcl-devel] PSETQ and SYMBOL-MACROLET interaction |
Date: |
Tue, 29 Oct 2002 06:53:15 -0600 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020826 |
Camm Maguire wrote:
Here is what I get:
(macroexpand '(symbol-macrolet ((x (aref a (incf i)))
(y (aref a (incf i))))
(let ((a (copy-seq #(0 1 2 3 4 5 6 7 8 9)))
(i 0))
(psetq x (aref a (incf i))
y (aref a (incf i)))
(values a i)))
)
(PROGN
(LET ((A (COPY-SEQ #(0 1 2 3 4 5 6 7 8 9))) (I 0))
(LET* ((#:G257108 (AREF A (INCF I))) (#:G257109 (AREF A (INCF I))))
(SETF (AREF A (INCF I)) #:G257108)
(SETF (AREF A (INCF I)) #:G257109)
NIL)
(VALUES A I)))
T
Apparently the PSETQ is being macroexpanded before the symbol macros
are substituted. Here's what happens when pcl::expand-symbol-macrolet-internal
is traced:
;;; *x* is bound to the form '(macroexpand '(symbol-macrolet ...)) given
;;; above.
>(eval *x*)
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I))))
(PROGN
(LET ((A (COPY-SEQ #(0 1 2 3 4 5 6 7 8 9))) (I 0))
(PSETQ X (AREF A (INCF I)) Y (AREF A (INCF I)))
(VALUES A I)))
:EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
(PROGN
(LET ((A (COPY-SEQ #(0 1 2 3 4 5 6 7 8 9))) (I 0))
(PSETQ X (AREF A (INCF I)) Y (AREF A (INCF I)))
(VALUES A I))))
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I))))
(LET ((A (COPY-SEQ #(0 1 2 3 4 5 6 7 8 9))) (I 0))
(PSETQ X (AREF A (INCF I)) Y (AREF A (INCF I)))
(VALUES A I))
:EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
(LET ((A (COPY-SEQ #(0 1 2 3 4 5 6 7 8 9))) (I 0))
(PSETQ X (AREF A (INCF I)) Y (AREF A (INCF I)))
(VALUES A I)))
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I))))
(COPY-SEQ #(0 1 2 3 4 5 6 7 8 9)) :EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
(COPY-SEQ #(0 1 2 3 4 5 6 7 8 9)))
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I))))
#(0 1 2 3 4 5 6 7 8 9) :EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL #(0 1 2 3 4 5 6 7 8 9))
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I)))) 0 :EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL 0)
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I))))
(PSETQ X (AREF A (INCF I)) Y (AREF A (INCF I))) :EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL
((I :LEXICAL-VAR) (A :LEXICAL-VAR))))
(#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
(PSETQ X (AREF A (INCF I)) Y (AREF A (INCF I))))
1> (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
((X NIL (AREF A (INCF I))) (Y NIL (AREF A (INCF I))))
(LET* ((#:G273277 (AREF A (INCF I)))
(#:G273278 (AREF A (INCF I))))
(SETQ X #:G273277)
(SETQ Y #:G273278)
NIL)
:EVAL
(NIL ((#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL
((I :LEXICAL-VAR) (A :LEXICAL-VAR))))
(#:G1469 MACRO
(#<compiled-closure 08d3d1dc> NIL NIL NIL)))
NIL))
<1 (PCL::EXPAND-SYMBOL-MACROLET-INTERNAL
(LET* ((#:G273277 (AREF A (INCF I)))
(#:G273278 (AREF A (INCF I))))
(SETQ X #:G273277)
(SETQ Y #:G273278)
NIL))
[etc]
I think the proper way to fix this is to rip out the PCL implementation
of symbol-macrolet and instead do symbol-macrolet expansion in the same
place ordinary macroexpansion is performed. The PCL implementation is
something of a hack, and I don't think it can be made correct in general
(the generic problem is that it 'manually' macroexpands subterms during
the code walk, but those subterms don't have symbol-macro substitution
performed on them, so if the macro inspects the results of such expansion
it sees the wrong thing.)
Judging by the conditional compile flag in this code, CMUCL has done this.
Paul
Re: [Gcl-devel] DO-SYMBOLS and DO-ALL-SYMBOLS don't have implicit tagbodies, Camm Maguire, 2002/10/18