guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 02/13: Remove top-marked? optimization from psyntax


From: Andy Wingo
Subject: [Guile-commits] 02/13: Remove top-marked? optimization from psyntax
Date: Thu, 25 Feb 2021 15:39:07 -0500 (EST)

wingo pushed a commit to branch master
in repository guile.

commit e054504fd4c29b996d0ec8dbc63a57018a7d76a3
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Wed Feb 24 16:01:02 2021 +0100

    Remove top-marked? optimization from psyntax
    
    * module/ice-9/psyntax.scm (strip): It used to be that terms in the
    source program could have a "top" mark, and when stripping marks we'd
    stop recursing when we see an expression with the top mark.  This had
    the good effect that source programs could contain quoted syntax
    objects, or quoted objects with shared structure -- in theory anyway.
    In practice the compiler didn't support objects with shared structure.
    Anyway when we switch to "read-syntax", quoted expressions can contain
    syntax objects introduced by the reader, which naturally we would want
    to strip away in a (quote FOO) form.  Therefore we remove the
    top-marked? optimization.
---
 module/ice-9/psyntax-pp.scm | 199 +++++++++++++++++++++-----------------------
 module/ice-9/psyntax.scm    | 128 +++++++++-------------------
 2 files changed, 135 insertions(+), 192 deletions(-)

diff --git a/module/ice-9/psyntax-pp.scm b/module/ice-9/psyntax-pp.scm
index b23572a..8efd082 100644
--- a/module/ice-9/psyntax-pp.scm
+++ b/module/ice-9/psyntax-pp.scm
@@ -523,15 +523,17 @@
          (and (not (null? list))
               (or (bound-id=? x (car list)) (bound-id-member? x (cdr list))))))
      (wrap (lambda (x w defmod) (source-wrap x w #f defmod)))
+     (wrap-syntax
+       (lambda (x w)
+         (make-syntax
+           (syntax-expression x)
+           w
+           (syntax-module x)
+           (syntax-source x))))
      (source-wrap
        (lambda (x w s defmod)
          (cond ((and (null? (car w)) (null? (cdr w)) (not s)) x)
-               ((syntax? x)
-                (make-syntax
-                  (syntax-expression x)
-                  (join-wraps w (syntax-wrap x))
-                  (syntax-module x)
-                  (syntax-source x)))
+               ((syntax? x) (wrap-syntax x (join-wraps w (syntax-wrap x))))
                ((null? x) x)
                (else (make-syntax x w defmod (or s (source-properties x)))))))
      (expand-sequence
@@ -712,7 +714,7 @@
                    e)))))
      (parse-when-list
        (lambda (e when-list)
-         (let ((result (strip when-list '(()))))
+         (let ((result (strip when-list)))
            (let lp ((l result))
              (cond ((null? l) result)
                    ((memq (car l) '(compile load eval expand)) (lp (cdr l)))
@@ -885,8 +887,7 @@
                         #f
                         "source expression failed to match any pattern"
                         tmp-1))))
-                 ((memv key '(constant))
-                  (build-data s (strip (source-wrap e w s mod) '(()))))
+                 ((memv key '(constant)) (build-data s (strip e)))
                  ((memv key '(global)) (build-global-reference s value mod))
                  ((memv key '(call))
                   (expand-call (expand (car e) r w mod) e r w s mod))
@@ -965,17 +966,11 @@
                        (let ((w (syntax-wrap x)))
                          (let ((ms (car w)) (ss (cdr w)))
                            (if (and (pair? ms) (eq? (car ms) #f))
-                             (make-syntax
-                               (syntax-expression x)
-                               (cons (cdr ms) (if rib (cons rib (cdr ss)) (cdr 
ss)))
-                               (syntax-module x)
-                               (syntax-source x))
-                             (make-syntax
-                               (decorate-source (syntax-expression x) s)
+                             (wrap-syntax x (cons (cdr ms) (if rib (cons rib 
(cdr ss)) (cdr ss))))
+                             (wrap-syntax
+                               x
                                (cons (cons m ms)
-                                     (if rib (cons rib (cons 'shift ss)) (cons 
'shift ss)))
-                               (syntax-module x)
-                               (syntax-source x))))))
+                                     (if rib (cons rib (cons 'shift ss)) (cons 
'shift ss))))))))
                       ((vector? x)
                        (let* ((n (vector-length x)) (v (decorate-source 
(make-vector n) s)))
                          (let loop ((i 0))
@@ -991,11 +986,11 @@
                          (source-wrap e w (cdr w) mod)
                          x))
                       (else (decorate-source x s))))))
-           (let* ((t-680b775fb37a463-d88 transformer-environment)
-                  (t-680b775fb37a463-d89 (lambda (k) (k e r w s rib mod))))
+           (let* ((t-680b775fb37a463-d7b transformer-environment)
+                  (t-680b775fb37a463-d7c (lambda (k) (k e r w s rib mod))))
              (with-fluid*
-               t-680b775fb37a463-d88
-               t-680b775fb37a463-d89
+               t-680b775fb37a463-d7b
+               t-680b775fb37a463-d7c
                (lambda ()
                  (rebuild-macro-output
                    (p (source-wrap e (anti-mark w) s mod))
@@ -1562,11 +1557,11 @@
                                           s
                                           mod
                                           get-formals
-                                          (map (lambda (tmp-680b775fb37a463-ff9
-                                                        tmp-680b775fb37a463-ff8
-                                                        
tmp-680b775fb37a463-ff7)
-                                                 (cons tmp-680b775fb37a463-ff7
-                                                       (cons 
tmp-680b775fb37a463-ff8 tmp-680b775fb37a463-ff9)))
+                                          (map (lambda (tmp-680b775fb37a463-fec
+                                                        tmp-680b775fb37a463-feb
+                                                        
tmp-680b775fb37a463-fea)
+                                                 (cons tmp-680b775fb37a463-fea
+                                                       (cons 
tmp-680b775fb37a463-feb tmp-680b775fb37a463-fec)))
                                                e2*
                                                e1*
                                                args*)))
@@ -1579,21 +1574,20 @@
                      #f
                      "source expression failed to match any pattern"
                      tmp))))))))
-     (strip (lambda (x w)
-              (if (memq 'top (car w))
-                x
-                (let f ((x x))
-                  (cond ((syntax? x) (strip (syntax-expression x) (syntax-wrap 
x)))
-                        ((pair? x)
-                         (let ((a (f (car x))) (d (f (cdr x))))
-                           (if (and (eq? a (car x)) (eq? d (cdr x))) x (cons a 
d))))
-                        ((vector? x)
-                         (let* ((old (vector->list x)) (new (map f old)))
-                           (let lp ((l1 old) (l2 new))
-                             (cond ((null? l1) x)
-                                   ((eq? (car l1) (car l2)) (lp (cdr l1) (cdr 
l2)))
-                                   (else (list->vector new))))))
-                        (else x))))))
+     (strip (lambda (x)
+              (letrec*
+                ((annotate
+                   (lambda (proc datum)
+                     (let ((src (proc x)))
+                       (if (and (pair? src) (supports-source-properties? 
datum))
+                         (set-source-properties! datum src))
+                       datum))))
+                (cond ((syntax? x) (annotate syntax-source (strip 
(syntax-expression x))))
+                      ((pair? x)
+                       (annotate source-properties (cons (strip (car x)) 
(strip (cdr x)))))
+                      ((vector? x)
+                       (annotate source-properties (list->vector (strip 
(vector->list x)))))
+                      (else x)))))
      (gen-var
        (lambda (id)
          (let ((id (if (syntax? id) (syntax-expression id) id)))
@@ -1659,7 +1653,7 @@
       (lambda (e r w s mod)
         (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any))))
           (if tmp
-            (apply (lambda (e) (build-data s (strip e w))) tmp)
+            (apply (lambda (e) (build-data s (strip e))) tmp)
             (syntax-violation 'quote "bad syntax" (source-wrap e w s mod))))))
     (global-extend
       'core
@@ -1872,11 +1866,9 @@
               (apply (lambda (args e1 e2)
                        (build-it
                          '()
-                         (map (lambda (tmp-680b775fb37a463-6a0
-                                       tmp-680b775fb37a463-69f
-                                       tmp-680b775fb37a463-69e)
-                                (cons tmp-680b775fb37a463-69e
-                                      (cons tmp-680b775fb37a463-69f 
tmp-680b775fb37a463-6a0)))
+                         (map (lambda (tmp-680b775fb37a463-1 
tmp-680b775fb37a463 tmp-680b775fb37a463-68f)
+                                (cons tmp-680b775fb37a463-68f
+                                      (cons tmp-680b775fb37a463 
tmp-680b775fb37a463-1)))
                               e2
                               e1
                               args)))
@@ -1888,11 +1880,11 @@
                   (apply (lambda (docstring args e1 e2)
                            (build-it
                              (list (cons 'documentation (syntax->datum 
docstring)))
-                             (map (lambda (tmp-680b775fb37a463-6b6
-                                           tmp-680b775fb37a463-6b5
-                                           tmp-680b775fb37a463-6b4)
-                                    (cons tmp-680b775fb37a463-6b4
-                                          (cons tmp-680b775fb37a463-6b5 
tmp-680b775fb37a463-6b6)))
+                             (map (lambda (tmp-680b775fb37a463-6a7
+                                           tmp-680b775fb37a463-6a6
+                                           tmp-680b775fb37a463-6a5)
+                                    (cons tmp-680b775fb37a463-6a5
+                                          (cons tmp-680b775fb37a463-6a6 
tmp-680b775fb37a463-6a7)))
                                   e2
                                   e1
                                   args)))
@@ -1915,9 +1907,9 @@
               (apply (lambda (args e1 e2)
                        (build-it
                          '()
-                         (map (lambda (tmp-680b775fb37a463-66a 
tmp-680b775fb37a463-1 tmp-680b775fb37a463)
+                         (map (lambda (tmp-680b775fb37a463-65b 
tmp-680b775fb37a463-65a tmp-680b775fb37a463)
                                 (cons tmp-680b775fb37a463
-                                      (cons tmp-680b775fb37a463-1 
tmp-680b775fb37a463-66a)))
+                                      (cons tmp-680b775fb37a463-65a 
tmp-680b775fb37a463-65b)))
                               e2
                               e1
                               args)))
@@ -1929,9 +1921,9 @@
                   (apply (lambda (docstring args e1 e2)
                            (build-it
                              (list (cons 'documentation (syntax->datum 
docstring)))
-                             (map (lambda (tmp-680b775fb37a463 
tmp-680b775fb37a463-67f tmp-680b775fb37a463-67e)
-                                    (cons tmp-680b775fb37a463-67e
-                                          (cons tmp-680b775fb37a463-67f 
tmp-680b775fb37a463)))
+                             (map (lambda (tmp-680b775fb37a463-1 
tmp-680b775fb37a463 tmp-680b775fb37a463-66f)
+                                    (cons tmp-680b775fb37a463-66f
+                                          (cons tmp-680b775fb37a463 
tmp-680b775fb37a463-1)))
                                   e2
                                   e1
                                   args)))
@@ -2285,7 +2277,7 @@
                                                         (lambda () (cvt x n 
ids))
                                                         (lambda (p ids) 
(values (vector 'vector p) ids))))
                                                     tmp-1)
-                                             (let ((x tmp)) (values (vector 
'atom (strip p '(()))) ids))))))))))))))))
+                                             (let ((x tmp)) (values (vector 
'atom (strip p)) ids))))))))))))))))
                (cvt pattern 0 '()))))
          (build-dispatch-call
            (lambda (pvars exp y r mod)
@@ -2439,7 +2431,7 @@
           (cond ((not source) (source-properties datum))
                 ((and (list? source) (and-map pair? source)) source)
                 (else (syntax-source source))))))
-    (set! syntax->datum (lambda (x) (strip x '(()))))
+    (set! syntax->datum (lambda (x) (strip x)))
     (set! generate-temporaries
       (lambda (ls)
         (let ((x ls))
@@ -2477,8 +2469,8 @@
                who
                message
                (or (source-annotation subform) (source-annotation form))
-               (strip form '(()))
-               (and subform (strip subform '(()))))))
+               (strip form)
+               (strip subform))))
     (letrec*
       ((%syntax-module
          (lambda (id)
@@ -2525,11 +2517,7 @@
                              ((memv key '(ellipsis))
                               (values
                                 'ellipsis
-                                (make-syntax
-                                  (syntax-expression value)
-                                  (anti-mark (syntax-wrap value))
-                                  (syntax-module value)
-                                  (syntax-source value))))
+                                (wrap-syntax value (anti-mark (syntax-wrap 
value)))))
                              (else (values 'other #f)))))))))))
        (syntax-locally-bound-identifiers
          (lambda (id)
@@ -2644,7 +2632,7 @@
                                     (if (null? xr*) (match-empty (vector-ref p 
1) r) (combine xr* r))))))
                           ((memv key '(free-id))
                            (and (id? e) (free-id=? (wrap e w mod) (vector-ref 
p 1)) r))
-                          ((memv key '(atom)) (and (equal? (vector-ref p 1) 
(strip e w)) r))
+                          ((memv key '(atom)) (and (equal? (vector-ref p 1) 
(strip e)) r))
                           ((memv key '(vector))
                            (and (vector? e) (match (vector->list e) 
(vector-ref p 1) w r mod)))))))))
        (match (lambda (e p w r mod)
@@ -2847,9 +2835,11 @@
                            #f
                            k
                            '()
-                           (map (lambda (tmp-680b775fb37a463-2 
tmp-680b775fb37a463-1 tmp-680b775fb37a463)
-                                  (list (cons tmp-680b775fb37a463 
tmp-680b775fb37a463-1)
-                                        tmp-680b775fb37a463-2))
+                           (map (lambda (tmp-680b775fb37a463-110c
+                                         tmp-680b775fb37a463-110b
+                                         tmp-680b775fb37a463-110a)
+                                  (list (cons tmp-680b775fb37a463-110a 
tmp-680b775fb37a463-110b)
+                                        tmp-680b775fb37a463-110c))
                                 template
                                 pattern
                                 keyword)))
@@ -2865,11 +2855,9 @@
                                #f
                                k
                                (list docstring)
-                               (map (lambda (tmp-680b775fb37a463-113f
-                                             tmp-680b775fb37a463-113e
-                                             tmp-680b775fb37a463-113d)
-                                      (list (cons tmp-680b775fb37a463-113d 
tmp-680b775fb37a463-113e)
-                                            tmp-680b775fb37a463-113f))
+                               (map (lambda (tmp-680b775fb37a463-2 
tmp-680b775fb37a463-1 tmp-680b775fb37a463)
+                                      (list (cons tmp-680b775fb37a463 
tmp-680b775fb37a463-1)
+                                            tmp-680b775fb37a463-2))
                                     template
                                     pattern
                                     keyword)))
@@ -2884,9 +2872,11 @@
                                    dots
                                    k
                                    '()
-                                   (map (lambda (tmp-680b775fb37a463-2 
tmp-680b775fb37a463-1 tmp-680b775fb37a463)
-                                          (list (cons tmp-680b775fb37a463 
tmp-680b775fb37a463-1)
-                                                tmp-680b775fb37a463-2))
+                                   (map (lambda (tmp-680b775fb37a463-113e
+                                                 tmp-680b775fb37a463-113d
+                                                 tmp-680b775fb37a463-113c)
+                                          (list (cons tmp-680b775fb37a463-113c 
tmp-680b775fb37a463-113d)
+                                                tmp-680b775fb37a463-113e))
                                         template
                                         pattern
                                         keyword)))
@@ -2902,9 +2892,11 @@
                                        dots
                                        k
                                        (list docstring)
-                                       (map (lambda (tmp-680b775fb37a463-2 
tmp-680b775fb37a463-1 tmp-680b775fb37a463)
-                                              (list (cons tmp-680b775fb37a463 
tmp-680b775fb37a463-1)
-                                                    tmp-680b775fb37a463-2))
+                                       (map (lambda (tmp-680b775fb37a463-115d
+                                                     tmp-680b775fb37a463-115c
+                                                     tmp-680b775fb37a463-115b)
+                                              (list (cons 
tmp-680b775fb37a463-115b tmp-680b775fb37a463-115c)
+                                                    tmp-680b775fb37a463-115d))
                                             template
                                             pattern
                                             keyword)))
@@ -3052,8 +3044,8 @@
                                                (apply (lambda (p)
                                                         (if (= lev 0)
                                                           (quasilist*
-                                                            (map (lambda 
(tmp-680b775fb37a463)
-                                                                   (list 
"value" tmp-680b775fb37a463))
+                                                            (map (lambda 
(tmp-680b775fb37a463-120d)
+                                                                   (list 
"value" tmp-680b775fb37a463-120d))
                                                                  p)
                                                             (quasi q lev))
                                                           (quasicons
@@ -3076,8 +3068,8 @@
                                                    (apply (lambda (p)
                                                             (if (= lev 0)
                                                               (quasiappend
-                                                                (map (lambda 
(tmp-680b775fb37a463-122c)
-                                                                       (list 
"value" tmp-680b775fb37a463-122c))
+                                                                (map (lambda 
(tmp-680b775fb37a463)
+                                                                       (list 
"value" tmp-680b775fb37a463))
                                                                      p)
                                                                 (quasi q lev))
                                                               (quasicons
@@ -3130,8 +3122,8 @@
                                       (apply (lambda (p)
                                                (if (= lev 0)
                                                  (quasiappend
-                                                   (map (lambda 
(tmp-680b775fb37a463)
-                                                          (list "value" 
tmp-680b775fb37a463))
+                                                   (map (lambda 
(tmp-680b775fb37a463-122d)
+                                                          (list "value" 
tmp-680b775fb37a463-122d))
                                                         p)
                                                    (vquasi q lev))
                                                  (quasicons
@@ -3231,8 +3223,7 @@
                        (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") 
each-any))))
                          (if tmp-1
                            (apply (lambda (y)
-                                    (k (map (lambda (tmp-680b775fb37a463-129c)
-                                              (list "quote" 
tmp-680b775fb37a463-129c))
+                                    (k (map (lambda (tmp-680b775fb37a463) 
(list "quote" tmp-680b775fb37a463))
                                             y)))
                                   tmp-1)
                            (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . 
each-any))))
@@ -3243,8 +3234,8 @@
                                    (apply (lambda (y z) (f z (lambda (ls) (k 
(append y ls))))) tmp-1)
                                    (let ((else tmp))
                                      (let ((tmp x))
-                                       (let ((t-680b775fb37a463-12ab tmp))
-                                         (list "list->vector" 
t-680b775fb37a463-12ab)))))))))))))))))
+                                       (let ((t-680b775fb37a463 tmp))
+                                         (list "list->vector" 
t-680b775fb37a463)))))))))))))))))
          (emit (lambda (x)
                  (let ((tmp x))
                    (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
@@ -3257,9 +3248,9 @@
                                     (let ((tmp-1 (map emit x)))
                                       (let ((tmp ($sc-dispatch tmp-1 
'each-any)))
                                         (if tmp
-                                          (apply (lambda 
(t-680b775fb37a463-12ba)
+                                          (apply (lambda 
(t-680b775fb37a463-12a0)
                                                    (cons (make-syntax 'list 
'((top)) '(hygiene guile))
-                                                         
t-680b775fb37a463-12ba))
+                                                         
t-680b775fb37a463-12a0))
                                                  tmp)
                                           (syntax-violation
                                             #f
@@ -3275,10 +3266,10 @@
                                             (let ((tmp-1 (list (emit (car x*)) 
(f (cdr x*)))))
                                               (let ((tmp ($sc-dispatch tmp-1 
'(any any))))
                                                 (if tmp
-                                                  (apply (lambda 
(t-680b775fb37a463-12ce t-680b775fb37a463-12cd)
+                                                  (apply (lambda 
(t-680b775fb37a463-12b4 t-680b775fb37a463-12b3)
                                                            (list (make-syntax 
'cons '((top)) '(hygiene guile))
-                                                                 
t-680b775fb37a463-12ce
-                                                                 
t-680b775fb37a463-12cd))
+                                                                 
t-680b775fb37a463-12b4
+                                                                 
t-680b775fb37a463-12b3))
                                                          tmp)
                                                   (syntax-violation
                                                     #f
@@ -3291,9 +3282,9 @@
                                             (let ((tmp-1 (map emit x)))
                                               (let ((tmp ($sc-dispatch tmp-1 
'each-any)))
                                                 (if tmp
-                                                  (apply (lambda 
(t-680b775fb37a463-12da)
+                                                  (apply (lambda 
(t-680b775fb37a463-12c0)
                                                            (cons (make-syntax 
'append '((top)) '(hygiene guile))
-                                                                 
t-680b775fb37a463-12da))
+                                                                 
t-680b775fb37a463-12c0))
                                                          tmp)
                                                   (syntax-violation
                                                     #f
@@ -3306,9 +3297,9 @@
                                                 (let ((tmp-1 (map emit x)))
                                                   (let ((tmp ($sc-dispatch 
tmp-1 'each-any)))
                                                     (if tmp
-                                                      (apply (lambda 
(t-680b775fb37a463-12e6)
+                                                      (apply (lambda 
(t-680b775fb37a463-12cc)
                                                                (cons 
(make-syntax 'vector '((top)) '(hygiene guile))
-                                                                     
t-680b775fb37a463-12e6))
+                                                                     
t-680b775fb37a463-12cc))
                                                              tmp)
                                                       (syntax-violation
                                                         #f
@@ -3319,9 +3310,9 @@
                                          (if tmp-1
                                            (apply (lambda (x)
                                                     (let ((tmp (emit x)))
-                                                      (let 
((t-680b775fb37a463-12f2 tmp))
+                                                      (let 
((t-680b775fb37a463-12d8 tmp))
                                                         (list (make-syntax 
'list->vector '((top)) '(hygiene guile))
-                                                              
t-680b775fb37a463-12f2))))
+                                                              
t-680b775fb37a463-12d8))))
                                                   tmp-1)
                                            (let ((tmp-1 ($sc-dispatch tmp 
'(#(atom "value") any))))
                                              (if tmp-1
diff --git a/module/ice-9/psyntax.scm b/module/ice-9/psyntax.scm
index 430ba31..aa13215 100644
--- a/module/ice-9/psyntax.scm
+++ b/module/ice-9/psyntax.scm
@@ -98,33 +98,6 @@
 ;;; compiled.  In this way, psyntax bootstraps off of an expanded
 ;;; version of itself.
 
-;;; This implementation of the expander sometimes uses syntactic
-;;; abstractions when procedural abstractions would suffice.  For
-;;; example, we define top-wrap and top-marked? as
-;;;
-;;;   (define-syntax top-wrap (identifier-syntax '((top))))
-;;;   (define-syntax top-marked?
-;;;     (syntax-rules ()
-;;;       ((_ w) (memq 'top (wrap-marks w)))))
-;;;
-;;; rather than
-;;;
-;;;   (define top-wrap '((top)))
-;;;   (define top-marked?
-;;;     (lambda (w) (memq 'top (wrap-marks w))))
-;;;
-;;; On the other hand, we don't do this consistently; we define
-;;; make-wrap, wrap-marks, and wrap-subst simply as
-;;;
-;;;   (define make-wrap cons)
-;;;   (define wrap-marks car)
-;;;   (define wrap-subst cdr)
-;;;
-;;; In Chez Scheme, the syntactic and procedural forms of these
-;;; abstractions are equivalent, since the optimizer consistently
-;;; integrates constants and small procedures.  This will be true of
-;;; Guile as well, once we implement a proper inliner.
-
 
 ;;; Implementation notes:
 
@@ -626,12 +599,8 @@
     (define-structure (ribcage symnames marks labels))
 
     (define-syntax empty-wrap (identifier-syntax '(())))
-
     (define-syntax top-wrap (identifier-syntax '((top))))
 
-    (define-syntax-rule (top-marked? w)
-      (memq 'top (wrap-marks w)))
-
     ;; Marks must be comparable with "eq?" and distinct from pairs and
     ;; the symbol top.  We do not use integers so that marks will remain
     ;; unique even across file compiles.
@@ -1043,15 +1012,16 @@
       (lambda (x w defmod)
         (source-wrap x w #f defmod)))
 
+    (define (wrap-syntax x w)
+      (make-syntax (syntax-expression x)
+                   w
+                   (syntax-module x)
+                   (syntax-source x)))
     (define source-wrap
       (lambda (x w s defmod)
         (cond
          ((and (null? (wrap-marks w)) (null? (wrap-subst w)) (not s)) x)
-         ((syntax? x)
-          (make-syntax (syntax-expression x)
-                       (join-wraps w (syntax-wrap x))
-                       (syntax-module x)
-                       (syntax-source x)))
+         ((syntax? x) (wrap-syntax x (join-wraps w (syntax-wrap x))))
          ((null? x) x)
          (else (make-syntax x w defmod (or s (source-properties x)))))))
 
@@ -1265,7 +1235,7 @@
         ;; we twingle the definition of eval-when to the bindings of
         ;; eval, load, expand, and compile, which is totally unintended.
         ;; So do a symbolic match instead.
-        (let ((result (strip when-list empty-wrap)))
+        (let ((result (strip when-list)))
           (let lp ((l result))
             (if (null? l)
                 result
@@ -1451,7 +1421,7 @@
                               value
                               (map (lambda (e) (expand e r w mod))
                                    #'(e ...))))))
-          ((constant) (build-data s (strip (source-wrap e w s mod) 
empty-wrap)))
+          ((constant) (build-data s (strip e)))
           ((global) (build-global-reference s value mod))
           ((call) (expand-call (expand (car e) r w mod) e r w s mod))
           ((begin-form)
@@ -1535,20 +1505,19 @@
                      (let ((ms (wrap-marks w)) (ss (wrap-subst w)))
                        (if (and (pair? ms) (eq? (car ms) the-anti-mark))
                            ;; output is from original text
-                           (make-syntax
-                            (syntax-expression x)
-                            (make-wrap (cdr ms) (if rib (cons rib (cdr ss)) 
(cdr ss)))
-                            (syntax-module x)
-                            (syntax-source x))
+                           (wrap-syntax
+                            x
+                            (make-wrap (cdr ms)
+                                       (if rib
+                                           (cons rib (cdr ss))
+                                           (cdr ss))))
                            ;; output introduced by macro
-                           (make-syntax
-                            (decorate-source (syntax-expression x) s)
+                           (wrap-syntax
+                            x
                             (make-wrap (cons m ms)
                                        (if rib
                                            (cons rib (cons 'shift ss))
-                                           (cons 'shift ss)))
-                            (syntax-module x)
-                            (syntax-source x))))))
+                                           (cons 'shift ss))))))))
                 
                   ((vector? x)
                    (let* ((n (vector-length x))
@@ -2000,36 +1969,22 @@
 
     ;; data
 
-    ;; strips syntax objects down to top-wrap
-    ;;
-    ;; since only the head of a list is annotated by the reader, not each pair
-    ;; in the spine, we also check for pairs whose cars are annotated in case
-    ;; we've been passed the cdr of an annotated list
-
-    (define strip
-      (lambda (x w)
-        (if (top-marked? w)
-            x
-            (let f ((x x))
-              (cond
-               ((syntax? x)
-                (strip (syntax-expression x) (syntax-wrap x)))
-               ((pair? x)
-                (let ((a (f (car x))) (d (f (cdr x))))
-                  (if (and (eq? a (car x)) (eq? d (cdr x)))
-                      x
-                      (cons a d))))
-               ((vector? x)
-                (let ((old (vector->list x)))
-                  (let ((new (map f old)))
-                    ;; inlined and-map with two args
-                    (let lp ((l1 old) (l2 new))
-                      (if (null? l1)
-                          x
-                          (if (eq? (car l1) (car l2))
-                              (lp (cdr l1) (cdr l2))
-                              (list->vector new)))))))
-               (else x))))))
+    ;; strips syntax objects, recursively.
+
+    (define (strip x)
+      (define (annotate proc datum)
+        (let ((src (proc x)))
+          (when (and (pair? src) (supports-source-properties? datum))
+            (set-source-properties! datum src))
+          datum))
+      (cond
+       ((syntax? x)
+        (annotate syntax-source (strip (syntax-expression x))))
+       ((pair? x)
+        (annotate source-properties (cons (strip (car x)) (strip (cdr x)))))
+       ((vector? x)
+        (annotate source-properties (list->vector (strip (vector->list x)))))
+       (else x)))
 
     ;; lexical variables
 
@@ -2102,7 +2057,7 @@
     (global-extend 'core 'quote
                    (lambda (e r w s mod)
                      (syntax-case e ()
-                       ((_ e) (build-data s (strip #'e w)))
+                       ((_ e) (build-data s (strip #'e)))
                        (_ (syntax-violation 'quote "bad syntax"
                                             (source-wrap e w s mod))))))
 
@@ -2641,7 +2596,7 @@
                                     (call-with-values
                                         (lambda () (cvt (syntax (x ...)) n 
ids))
                                       (lambda (p ids) (values (vector 'vector 
p) ids))))
-                                   (x (values (vector 'atom (strip p 
empty-wrap)) ids))))))
+                                   (x (values (vector 'atom (strip p)) 
ids))))))
                          (cvt pattern 0 '())))
 
                      (define build-dispatch-call
@@ -2786,7 +2741,7 @@
           ;; accepts any object, since syntax objects may consist partially
           ;; or entirely of unwrapped, nonsymbolic data
           (lambda (x)
-            (strip x empty-wrap)))
+            (strip x)))
 
     (set! generate-temporaries
           (lambda (ls)
@@ -2816,8 +2771,8 @@
             (throw 'syntax-error who message
                    (or (source-annotation subform)
                        (source-annotation form))
-                   (strip form empty-wrap)
-                   (and subform (strip subform empty-wrap)))))
+                   (strip form)
+                   (strip subform))))
 
     (let ()
       (define (%syntax-module id)
@@ -2857,10 +2812,7 @@
                       (values 'global (cons value (cdr mod)))))
                  ((ellipsis)
                   (values 'ellipsis
-                          (make-syntax (syntax-expression value)
-                                       (anti-mark (syntax-wrap value))
-                                       (syntax-module value)
-                                       (syntax-source value))))
+                          (wrap-syntax value (anti-mark (syntax-wrap value)))))
                  (else (values 'other #f))))))))
 
       (define (syntax-locally-bound-identifiers id)
@@ -3010,7 +2962,7 @@
                             (match-empty (vector-ref p 1) r)
                             (combine xr* r))))))
               ((free-id) (and (id? e) (free-id=? (wrap e w mod) (vector-ref p 
1)) r))
-              ((atom) (and (equal? (vector-ref p 1) (strip e w)) r))
+              ((atom) (and (equal? (vector-ref p 1) (strip e)) r))
               ((vector)
                (and (vector? e)
                     (match (vector->list e) (vector-ref p 1) w r mod))))))))



reply via email to

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