gcl-devel
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]