Merge branch 'stable-2.0'
authorMark H Weaver <mhw@netris.org>
Tue, 14 Jan 2014 06:16:42 +0000 (01:16 -0500)
committerMark H Weaver <mhw@netris.org>
Tue, 14 Jan 2014 06:30:56 +0000 (01:30 -0500)
Conflicts:
libguile/hash.c
module/ice-9/psyntax-pp.scm
module/ice-9/psyntax.scm
test-suite/tests/r6rs-ports.test

1  2 
doc/ref/api-macros.texi
doc/ref/guile.texi
libguile/hash.c
libguile/r6rs-ports.c
module/ice-9/command-line.scm
module/ice-9/local-eval.scm
module/ice-9/psyntax-pp.scm
module/ice-9/psyntax.scm
module/system/repl/common.scm
test-suite/tests/r6rs-ports.test
test-suite/tests/syntax.test

@@@ -740,15 -819,12 +820,18 @@@ of @code{eq?}) identifying this binding
  @item macro
  A syntax transformer, either local or global.  The value is the
  transformer procedure.
 +@item syntax-parameter
 +A syntax parameter (@pxref{Syntax Parameters}).  By default,
 +@code{syntax-local-binding} will resolve syntax parameters, so that this
 +value will not be returned.  Pass @code{#:resolve-syntax-parameters? #f}
 +to indicate that you are interested in syntax parameters.  The value is
 +the default transformer procedure, as in @code{macro}.
  @item pattern-variable
- A pattern variable, bound via syntax-case.  The value is an opaque
- object, internal to the expander.
+ A pattern variable, bound via @code{syntax-case}.  The value is an
+ opaque object, internal to the expander.
+ @item ellipsis
+ An internal binding, bound via @code{with-ellipsis}.  The value is the
+ (anti-marked) local ellipsis identifier.
  @item displaced-lexical
  A lexical variable that has gone out of scope.  This can happen if a
  badly-written procedural macro saves a syntax object, then attempts to
Simple merge
diff --cc libguile/hash.c
@@@ -1,6 -1,6 +1,6 @@@
  /* Copyright (C) 1995, 1996, 1997, 2000, 2001, 2003, 2004, 2006, 2008,
 - *   2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
 + *   2009, 2010, 2011, 2012 Free Software Foundation, Inc.
-  * 
+  *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public License
   * as published by the Free Software Foundation; either version 3 of
Simple merge
Simple merge
                                   (cdr val)
                                   t)
                             patterns))))
+               ((ellipsis)
+                (lp ids capture formals
+                    (cons (lambda (x)
+                            #`(with-ellipsis #,val #,x))
+                          wrappers)
+                    patterns))
                (else
 -               (error "what" type val))))))))))
 +               ;; Interestingly, this case can include globals (and
 +               ;; global macros), now that Guile tracks which globals it
 +               ;; introduces.  Not sure what to do here!  For now, punt.
 +               ;; 
 +               (lp ids capture formals wrappers patterns))))))))))
  
  (define-syntax the-environment
    (lambda (x)
         (if (null? r)
           '()
           (let ((a (car r)))
-            (if (memq (cadr a) '(macro syntax-parameter))
 -           (if (memq (cadr a) '(macro ellipsis))
++           (if (memq (cadr a) '(macro syntax-parameter ellipsis))
               (cons a (macros-only-env (cdr r)))
               (macros-only-env (cdr r)))))))
 -   (lookup
 -     (lambda (x r mod)
 -       (let ((t (assq x r)))
 -         (cond (t (cdr t))
 -               ((symbol? x) (or (get-global-definition-hook x mod) '(global)))
 -               (else '(displaced-lexical))))))
     (global-extend
       (lambda (type sym val) (put-global-definition-hook sym type val)))
     (nonsymbol-id?
                 (cons first (dobody (cdr body) r w mod))))))))
     (expand-top-sequence
       (lambda (body r w s m esew mod)
 -       (letrec*
 -         ((scan (lambda (body r w s m esew mod exps)
 -                  (if (null? body)
 -                    exps
 -                    (call-with-values
 -                      (lambda ()
 -                        (call-with-values
 -                          (lambda ()
 -                            (let ((e (car body)))
 -                              (syntax-type e r w (or (source-annotation e) s) #f mod #f)))
 -                          (lambda (type value form e w s mod)
 -                            (let ((key type))
 -                              (cond ((memv key '(begin-form))
 -                                     (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_))))
 -                                       (if tmp-1
 -                                         (apply (lambda () exps) tmp-1)
 -                                         (let ((tmp-1 ($sc-dispatch tmp '(_ any . each-any))))
 -                                           (if tmp-1
 -                                             (apply (lambda (e1 e2) (scan (cons e1 e2) r w s m esew mod exps))
 -                                                    tmp-1)
 -                                             (syntax-violation
 -                                               #f
 -                                               "source expression failed to match any pattern"
 -                                               tmp))))))
 -                                    ((memv key '(local-syntax-form))
 -                                     (expand-local-syntax
 -                                       value
 -                                       e
 -                                       r
 -                                       w
 -                                       s
 -                                       mod
 -                                       (lambda (body r w s mod) (scan body r w s m esew mod exps))))
 -                                    ((memv key '(eval-when-form))
 -                                     (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
 -                                       (if tmp
 -                                         (apply (lambda (x e1 e2)
 -                                                  (let ((when-list (parse-when-list e x)) (body (cons e1 e2)))
 -                                                    (cond ((eq? m 'e)
 -                                                           (if (memq 'eval when-list)
 -                                                             (scan body
 -                                                                   r
 -                                                                   w
 -                                                                   s
 -                                                                   (if (memq 'expand when-list) 'c&e 'e)
 -                                                                   '(eval)
 -                                                                   mod
 -                                                                   exps)
 -                                                             (begin
 -                                                               (if (memq 'expand when-list)
 -                                                                 (top-level-eval-hook
 -                                                                   (expand-top-sequence body r w s 'e '(eval) mod)
 -                                                                   mod))
 -                                                               (values exps))))
 -                                                          ((memq 'load when-list)
 -                                                           (cond ((or (memq 'compile when-list)
 -                                                                      (memq 'expand when-list)
 -                                                                      (and (eq? m 'c&e) (memq 'eval when-list)))
 -                                                                  (scan body r w s 'c&e '(compile load) mod exps))
 -                                                                 ((memq m '(c c&e))
 -                                                                  (scan body r w s 'c '(load) mod exps))
 -                                                                 (else (values exps))))
 -                                                          ((or (memq 'compile when-list)
 -                                                               (memq 'expand when-list)
 -                                                               (and (eq? m 'c&e) (memq 'eval when-list)))
 +       (let* ((r (cons '("placeholder" placeholder) r))
 +              (ribcage (make-ribcage '() '() '()))
 +              (w (cons (car w) (cons ribcage (cdr w)))))
 +         (letrec*
 +           ((record-definition!
 +              (lambda (id var)
 +                (let ((mod (cons 'hygiene (module-name (current-module)))))
 +                  (extend-ribcage!
 +                    ribcage
 +                    id
 +                    (cons (syntax-object-module id) (wrap var '((top)) mod))))))
 +            (macro-introduced-identifier?
 +              (lambda (id) (not (equal? (car (syntax-object-wrap id)) '(top)))))
 +            (fresh-derived-name
 +              (lambda (id orig-form)
 +                (symbol-append
 +                  (syntax-object-expression id)
 +                  '-
 +                  (string->symbol
 +                    (number->string
 +                      (hash (syntax->datum orig-form) most-positive-fixnum)
 +                      16)))))
 +            (parse (lambda (body r w s m esew mod)
 +                     (let lp ((body body) (exps '()))
 +                       (if (null? body)
 +                         exps
 +                         (lp (cdr body) (append (parse1 (car body) r w s m esew mod) exps))))))
 +            (parse1
 +              (lambda (x r w s m esew mod)
 +                (call-with-values
 +                  (lambda () (syntax-type x r w (source-annotation x) ribcage mod #f))
 +                  (lambda (type value form e w s mod)
 +                    (let ((key type))
 +                      (cond ((memv key '(define-form))
 +                             (let* ((id (wrap value w mod))
 +                                    (label (gen-label))
 +                                    (var (if (macro-introduced-identifier? id)
 +                                           (fresh-derived-name id x)
 +                                           (syntax-object-expression id))))
 +                               (record-definition! id var)
 +                               (list (if (eq? m 'c&e)
 +                                       (let ((x (build-global-definition s var (expand e r w mod))))
 +                                         (top-level-eval-hook x mod)
 +                                         (lambda () x))
-                                        (lambda () (build-global-definition s var (expand e r w mod)))))))
++                                       (call-with-values
++                                         (lambda () (resolve-identifier id '(()) r mod #t))
++                                         (lambda (type* value* mod*)
++                                           (if (eq? type* 'macro)
++                                             (top-level-eval-hook
++                                               (build-global-definition s var (build-void s))
++                                               mod))
++                                           (lambda () (build-global-definition s var (expand e r w mod)))))))))
 +                            ((memv key '(define-syntax-form define-syntax-parameter-form))
 +                             (let* ((id (wrap value w mod))
 +                                    (label (gen-label))
 +                                    (var (if (macro-introduced-identifier? id)
 +                                           (fresh-derived-name id x)
 +                                           (syntax-object-expression id))))
 +                               (record-definition! id var)
 +                               (let ((key m))
 +                                 (cond ((memv key '(c))
 +                                        (cond ((memq 'compile esew)
 +                                               (let ((e (expand-install-global var type (expand e r w mod))))
 +                                                 (top-level-eval-hook e mod)
 +                                                 (if (memq 'load esew) (list (lambda () e)) '())))
 +                                              ((memq 'load esew)
 +                                               (list (lambda () (expand-install-global var type (expand e r w mod)))))
 +                                              (else '())))
 +                                       ((memv key '(c&e))
 +                                        (let ((e (expand-install-global var type (expand e r w mod))))
 +                                          (top-level-eval-hook e mod)
 +                                          (list (lambda () e))))
 +                                       (else
 +                                        (if (memq 'eval esew)
 +                                          (top-level-eval-hook
 +                                            (expand-install-global var type (expand e r w mod))
 +                                            mod))
 +                                        '())))))
 +                            ((memv key '(begin-form))
 +                             (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
 +                               (if tmp
 +                                 (apply (lambda (e1) (parse e1 r w s m esew mod)) tmp)
 +                                 (syntax-violation
 +                                   #f
 +                                   "source expression failed to match any pattern"
 +                                   tmp-1))))
 +                            ((memv key '(local-syntax-form))
 +                             (expand-local-syntax
 +                               value
 +                               e
 +                               r
 +                               w
 +                               s
 +                               mod
 +                               (lambda (forms r w s mod) (parse forms r w s m esew mod))))
 +                            ((memv key '(eval-when-form))
 +                             (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
 +                               (if tmp
 +                                 (apply (lambda (x e1 e2)
 +                                          (let ((when-list (parse-when-list e x)) (body (cons e1 e2)))
 +                                            (letrec*
 +                                              ((recurse (lambda (m esew) (parse body r w s m esew mod))))
 +                                              (cond ((eq? m 'e)
 +                                                     (if (memq 'eval when-list)
 +                                                       (recurse (if (memq 'expand when-list) 'c&e 'e) '(eval))
 +                                                       (begin
 +                                                         (if (memq 'expand when-list)
                                                             (top-level-eval-hook
                                                               (expand-top-sequence body r w s 'e '(eval) mod)
 -                                                             mod)
 -                                                           (values exps))
 -                                                          (else (values exps)))))
 -                                                tmp)
 -                                         (syntax-violation
 -                                           #f
 -                                           "source expression failed to match any pattern"
 -                                           tmp-1))))
 -                                    ((memv key '(define-syntax-form define-syntax-parameter-form))
 -                                     (let ((n (id-var-name value w)) (r (macros-only-env r)))
 -                                       (let ((key m))
 -                                         (cond ((memv key '(c))
 -                                                (cond ((memq 'compile esew)
 -                                                       (let ((e (expand-install-global n (expand e r w mod))))
 -                                                         (top-level-eval-hook e mod)
 -                                                         (if (memq 'load esew) (values (cons e exps)) (values exps))))
 -                                                      ((memq 'load esew)
 -                                                       (values
 -                                                         (cons (expand-install-global n (expand e r w mod)) exps)))
 -                                                      (else (values exps))))
 -                                               ((memv key '(c&e))
 -                                                (let ((e (expand-install-global n (expand e r w mod))))
 -                                                  (top-level-eval-hook e mod)
 -                                                  (values (cons e exps))))
 -                                               (else
 -                                                (if (memq 'eval esew)
 -                                                  (top-level-eval-hook
 -                                                    (expand-install-global n (expand e r w mod))
 -                                                    mod))
 -                                                (values exps))))))
 -                                    ((memv key '(define-form))
 -                                     (let* ((n (id-var-name value w)) (type (car (lookup n r mod))) (key type))
 -                                       (cond ((memv key '(global core macro module-ref))
 -                                              (if (and (memq m '(c c&e))
 -                                                       (not (module-local-variable (current-module) n))
 -                                                       (current-module))
 -                                                (let ((old (module-variable (current-module) n)))
 -                                                  (if (and (variable? old)
 -                                                           (variable-bound? old)
 -                                                           (not (macro? (variable-ref old))))
 -                                                    (module-define! (current-module) n (variable-ref old))
 -                                                    (module-add! (current-module) n (make-undefined-variable)))))
 -                                              (values
 -                                                (cons (if (eq? m 'c&e)
 -                                                        (let ((x (build-global-definition s n (expand e r w mod))))
 -                                                          (top-level-eval-hook x mod)
 -                                                          x)
 -                                                        (lambda () (build-global-definition s n (expand e r w mod))))
 -                                                      exps)))
 -                                             ((memv key '(displaced-lexical))
 -                                              (syntax-violation
 -                                                #f
 -                                                "identifier out of context"
 -                                                (source-wrap form w s mod)
 -                                                (wrap value w mod)))
 -                                             (else
 -                                              (syntax-violation
 -                                                #f
 -                                                "cannot define keyword at top level"
 -                                                (source-wrap form w s mod)
 -                                                (wrap value w mod))))))
 -                                    (else
 -                                     (values
 -                                       (cons (if (eq? m 'c&e)
 -                                               (let ((x (expand-expr type value form e r w s mod)))
 -                                                 (top-level-eval-hook x mod)
 -                                                 x)
 -                                               (lambda () (expand-expr type value form e r w s mod)))
 -                                             exps))))))))
 -                      (lambda (exps) (scan (cdr body) r w s m esew mod exps)))))))
 -         (call-with-values
 -           (lambda () (scan body r w s m esew mod '()))
 -           (lambda (exps)
 -             (if (null? exps)
 -               (build-void s)
 -               (build-sequence
 -                 s
 -                 (let lp ((in exps) (out '()))
 -                   (if (null? in)
 -                     out
 -                     (let ((e (car in)))
 -                       (lp (cdr in) (cons (if (procedure? e) (e) e) out))))))))))))
 +                                                             mod))
 +                                                         '())))
 +                                                    ((memq 'load when-list)
 +                                                     (cond ((or (memq 'compile when-list)
 +                                                                (memq 'expand when-list)
 +                                                                (and (eq? m 'c&e) (memq 'eval when-list)))
 +                                                            (recurse 'c&e '(compile load)))
 +                                                           ((memq m '(c c&e)) (recurse 'c '(load)))
 +                                                           (else '())))
 +                                                    ((or (memq 'compile when-list)
 +                                                         (memq 'expand when-list)
 +                                                         (and (eq? m 'c&e) (memq 'eval when-list)))
 +                                                     (top-level-eval-hook
 +                                                       (expand-top-sequence body r w s 'e '(eval) mod)
 +                                                       mod)
 +                                                     '())
 +                                                    (else '())))))
 +                                        tmp)
 +                                 (syntax-violation
 +                                   #f
 +                                   "source expression failed to match any pattern"
 +                                   tmp-1))))
 +                            (else
 +                             (list (if (eq? m 'c&e)
 +                                     (let ((x (expand-expr type value form e r w s mod)))
 +                                       (top-level-eval-hook x mod)
 +                                       (lambda () x))
 +                                     (lambda () (expand-expr type value form e r w s mod))))))))))))
 +           (let ((exps (map (lambda (x) (x)) (reverse (parse body r w s m esew mod)))))
 +             (if (null? exps) (build-void s) (build-sequence s exps)))))))
     (expand-install-global
 -     (lambda (name e)
 +     (lambda (name type e)
         (build-global-definition
           #f
           name
             (syntax-violation #f "nonprocedure transformer" p)))))
     (expand-void (lambda () (build-void #f)))
     (ellipsis?
-      (lambda (x)
-        (and (nonsymbol-id? x)
-             (free-id=? x '#(syntax-object ... ((top)) (hygiene guile))))))
+      (lambda (e r mod)
+        (and (nonsymbol-id? e)
 -            (let* ((id (make-syntax-object
 -                         '#{ $sc-ellipsis }#
 -                         (syntax-object-wrap e)
 -                         (syntax-object-module e)))
 -                   (n (id-var-name id '(())))
 -                   (b (lookup n r mod)))
 -              (if (eq? (car b) 'ellipsis)
 -                (bound-id=? e (cdr b))
 -                (free-id=? e '#(syntax-object ... ((top)) (hygiene guile))))))))
++            (call-with-values
++              (lambda ()
++                (resolve-identifier
++                  (make-syntax-object
++                    '#{ $sc-ellipsis }#
++                    (syntax-object-wrap e)
++                    (syntax-object-module e))
++                  '(())
++                  r
++                  mod
++                  #f))
++              (lambda (type value mod)
++                (if (eq? type 'ellipsis)
++                  (bound-id=? e value)
++                  (free-id=? e '#(syntax-object ... ((top)) (hygiene guile)))))))))
     (lambda-formals
       (lambda (orig-args)
         (letrec*
        ((gen-syntax
           (lambda (src e r maps ellipsis? mod)
             (if (id? e)
 -             (let* ((label (id-var-name e '(()))) (b (lookup label r mod)))
 -               (cond ((eq? (car b) 'syntax)
 -                      (call-with-values
 -                        (lambda ()
 -                          (let ((var.lev (cdr b)))
 -                            (gen-ref src (car var.lev) (cdr var.lev) maps)))
 -                        (lambda (var maps) (values (list 'ref var) maps))))
 -                     ((ellipsis? e r mod)
 -                      (syntax-violation 'syntax "misplaced ellipsis" src))
 -                     (else (values (list 'quote e) maps))))
 +             (call-with-values
 +               (lambda () (resolve-identifier e '(()) r mod #f))
 +               (lambda (type value mod)
 +                 (let ((key type))
 +                   (cond ((memv key '(syntax))
 +                          (call-with-values
 +                            (lambda () (gen-ref src (car value) (cdr value) maps))
 +                            (lambda (var maps) (values (list 'ref var) maps))))
-                          ((ellipsis? e) (syntax-violation 'syntax "misplaced ellipsis" src))
++                         ((ellipsis? e r mod)
++                          (syntax-violation 'syntax "misplaced ellipsis" src))
 +                         (else (values (list 'quote e) maps))))))
               (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(any any))))
-                (if (and tmp-1 (apply (lambda (dots e) (ellipsis? dots)) tmp-1))
-                  (apply (lambda (dots e) (gen-syntax src e r maps (lambda (x) #f) mod))
+                (if (and tmp-1 (apply (lambda (dots e) (ellipsis? dots r mod)) tmp-1))
+                  (apply (lambda (dots e) (gen-syntax src e r maps (lambda (e r mod) #f) mod))
                          tmp-1)
                   (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
-                    (if (and tmp-1 (apply (lambda (x dots y) (ellipsis? dots)) tmp-1))
+                    (if (and tmp-1 (apply (lambda (x dots y) (ellipsis? dots r mod)) tmp-1))
                       (apply (lambda (x dots y)
                                (let f ((y y)
                                        (k (lambda (maps)
                 (tmp ($sc-dispatch tmp-1 '(_ any each-any . each-any))))
            (if tmp
              (apply (lambda (val key m)
-                      (if (and-map (lambda (x) (and (id? x) (not (ellipsis? x)))) key)
+                      (if (and-map (lambda (x) (and (id? x) (not (ellipsis? x r mod)))) key)
                         (let ((x (gen-var 'tmp)))
 -                         (build-application
 +                         (build-call
                             s
                             (build-simple-lambda
                               #f
                     (let ((key type))
                       (cond ((memv key '(lexical)) (values 'lexical value))
                             ((memv key '(macro)) (values 'macro value))
 +                           ((memv key '(syntax-parameter))
 +                            (values 'syntax-parameter (car value)))
                             ((memv key '(syntax)) (values 'pattern-variable value))
                             ((memv key '(displaced-lexical)) (values 'displaced-lexical #f))
 -                           ((memv key '(global)) (values 'global (cons value (cdr mod))))
 +                           ((memv key '(global))
 +                            (if (equal? mod '(primitive))
 +                              (values 'primitive value)
 +                              (values 'global (cons value (cdr mod)))))
+                            ((memv key '(ellipsis))
+                             (values
+                               'ellipsis
+                               (make-syntax-object
+                                 (syntax-object-expression value)
+                                 (anti-mark (syntax-object-wrap value))
+                                 (syntax-object-module value))))
                             (else (values 'other #f)))))))))))
       (syntax-locally-bound-identifiers
         (lambda (id)
                        "source expression failed to match any pattern"
                        tmp)))))))))))
  
- (define syntax-rules
+ (define syntax-error
    (make-syntax-transformer
-     'syntax-rules
+     'syntax-error
      'macro
-     (lambda (xx)
-       (let ((tmp-1 xx))
-         (let ((tmp ($sc-dispatch tmp-1 '(_ each-any . #(each ((any . any) any))))))
-           (if tmp
-             (apply (lambda (k keyword pattern template)
-                      (list '#(syntax-object lambda ((top)) (hygiene guile))
-                            '(#(syntax-object x ((top)) (hygiene guile)))
-                            (vector
-                              '(#(syntax-object macro-type ((top)) (hygiene guile))
-                                .
-                                #(syntax-object
-                                  syntax-rules
-                                  ((top)
-                                   #(ribcage
-                                     #(syntax-rules)
-                                     #((top))
-                                     #(((hygiene guile)
-                                        .
-                                        #(syntax-object syntax-rules ((top)) (hygiene guile))))))
-                                  (hygiene guile)))
-                              (cons '#(syntax-object patterns ((top)) (hygiene guile)) pattern))
-                            (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
-                                  (cons '#(syntax-object x ((top)) (hygiene guile))
-                                        (cons k
-                                              (map (lambda (tmp-1 tmp)
-                                                     (list (cons '#(syntax-object _ ((top)) (hygiene guile)) tmp)
-                                                           (list '#(syntax-object syntax ((top)) (hygiene guile))
-                                                                 tmp-1)))
-                                                   template
-                                                   pattern))))))
+     (lambda (x)
+       (let ((tmp-1 x))
+         (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any . each-any))))
+           (if (if tmp
+                 (apply (lambda (keyword operands message arg)
+                          (string? (syntax->datum message)))
+                        tmp)
+                 #f)
+             (apply (lambda (keyword operands message arg)
+                      (syntax-violation
+                        (syntax->datum keyword)
+                        (string-join
+                          (cons (syntax->datum message)
+                                (map (lambda (x) (object->string (syntax->datum x))) arg)))
+                        (if (syntax->datum keyword) (cons keyword operands) #f)))
                     tmp)
-             (let ((tmp ($sc-dispatch tmp-1 '(_ each-any any . #(each ((any . any) any))))))
+             (let ((tmp ($sc-dispatch tmp-1 '(_ any . each-any))))
                (if (if tmp
-                     (apply (lambda (k docstring keyword pattern template)
-                              (string? (syntax->datum docstring)))
-                            tmp)
+                     (apply (lambda (message arg) (string? (syntax->datum message))) tmp)
                      #f)
-                 (apply (lambda (k docstring keyword pattern template)
-                          (list '#(syntax-object lambda ((top)) (hygiene guile))
-                                '(#(syntax-object x ((top)) (hygiene guile)))
-                                docstring
-                                (vector
-                                  '(#(syntax-object macro-type ((top)) (hygiene guile))
-                                    .
-                                    #(syntax-object
-                                      syntax-rules
-                                      ((top)
-                                       #(ribcage
-                                         #(syntax-rules)
-                                         #((top))
-                                         #(((hygiene guile)
-                                            .
-                                            #(syntax-object syntax-rules ((top)) (hygiene guile))))))
-                                      (hygiene guile)))
-                                  (cons '#(syntax-object patterns ((top)) (hygiene guile)) pattern))
-                                (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
-                                      (cons '#(syntax-object x ((top)) (hygiene guile))
-                                            (cons k
-                                                  (map (lambda (tmp-1 tmp)
-                                                         (list (cons '#(syntax-object _ ((top)) (hygiene guile)) tmp)
-                                                               (list '#(syntax-object syntax ((top)) (hygiene guile))
-                                                                     tmp-1)))
-                                                       template
-                                                       pattern))))))
+                 (apply (lambda (message arg)
 -                         (cons '#(syntax-object syntax-error ((top)) (hygiene guile))
++                         (cons '#(syntax-object
++                                  syntax-error
++                                  ((top)
++                                   #(ribcage
++                                     #(syntax-error)
++                                     #((top))
++                                     #(((hygiene guile)
++                                        .
++                                        #(syntax-object syntax-error ((top)) (hygiene guile))))))
++                                  (hygiene guile))
+                                (cons '(#f) (cons message arg))))
                         tmp)
                  (syntax-violation
                    #f
                    "source expression failed to match any pattern"
                    tmp-1)))))))))
  
 -                                                               #(syntax-object syntax-rules ((top)) (hygiene guile)))
+ (define syntax-rules
+   (make-syntax-transformer
+     'syntax-rules
+     'macro
+     (lambda (xx)
+       (letrec*
+         ((expand-clause
+            (lambda (clause)
+              (let ((tmp-1 clause))
+                (let ((tmp ($sc-dispatch
+                             tmp-1
+                             '((any . any)
+                               (#(free-id #(syntax-object syntax-error ((top)) (hygiene guile)))
+                                any
+                                .
+                                each-any)))))
+                  (if (if tmp
+                        (apply (lambda (keyword pattern message arg)
+                                 (string? (syntax->datum message)))
+                               tmp)
+                        #f)
+                    (apply (lambda (keyword pattern message arg)
+                             (list (cons '#(syntax-object dummy ((top)) (hygiene guile)) pattern)
+                                   (list '#(syntax-object syntax ((top)) (hygiene guile))
+                                         (cons '#(syntax-object syntax-error ((top)) (hygiene guile))
+                                               (cons (cons '#(syntax-object dummy ((top)) (hygiene guile)) pattern)
+                                                     (cons message arg))))))
+                           tmp)
+                    (let ((tmp ($sc-dispatch tmp-1 '((any . any) any))))
+                      (if tmp
+                        (apply (lambda (keyword pattern template)
+                                 (list (cons '#(syntax-object dummy ((top)) (hygiene guile)) pattern)
+                                       (list '#(syntax-object syntax ((top)) (hygiene guile)) template)))
+                               tmp)
+                        (syntax-violation
+                          #f
+                          "source expression failed to match any pattern"
+                          tmp-1))))))))
+          (expand-syntax-rules
+            (lambda (dots keys docstrings clauses)
+              (let ((tmp-1 (list keys docstrings clauses (map expand-clause clauses))))
+                (let ((tmp ($sc-dispatch
+                             tmp-1
+                             '(each-any each-any #(each ((any . any) any)) each-any))))
+                  (if tmp
+                    (apply (lambda (k docstring keyword pattern template clause)
+                             (let ((tmp (cons '#(syntax-object lambda ((top)) (hygiene guile))
+                                              (cons '(#(syntax-object x ((top)) (hygiene guile)))
+                                                    (append
+                                                      docstring
+                                                      (list (vector
+                                                              '(#(syntax-object macro-type ((top)) (hygiene guile))
+                                                                .
++                                                               #(syntax-object
++                                                                 syntax-rules
++                                                                 ((top)
++                                                                  #(ribcage
++                                                                    #(syntax-rules)
++                                                                    #((top))
++                                                                    #(((hygiene guile)
++                                                                       .
++                                                                       #(syntax-object
++                                                                         syntax-rules
++                                                                         ((top))
++                                                                         (hygiene guile))))))
++                                                                 (hygiene guile)))
+                                                              (cons '#(syntax-object patterns ((top)) (hygiene guile))
+                                                                    pattern))
+                                                            (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
+                                                                  (cons '#(syntax-object x ((top)) (hygiene guile))
+                                                                        (cons k clause)))))))))
+                               (let ((form tmp))
+                                 (if dots
+                                   (let ((tmp dots))
+                                     (let ((dots tmp))
+                                       (list '#(syntax-object with-ellipsis ((top)) (hygiene guile))
+                                             dots
+                                             form)))
+                                   form))))
+                           tmp)
+                    (syntax-violation
+                      #f
+                      "source expression failed to match any pattern"
+                      tmp-1)))))))
+         (let ((tmp xx))
+           (let ((tmp-1 ($sc-dispatch tmp '(_ each-any . #(each ((any . any) any))))))
+             (if tmp-1
+               (apply (lambda (k keyword pattern template)
+                        (expand-syntax-rules
+                          #f
+                          k
+                          '()
+                          (map (lambda (tmp-2 tmp-1 tmp) (list (cons tmp tmp-1) tmp-2))
+                               template
+                               pattern
+                               keyword)))
+                      tmp-1)
+               (let ((tmp-1 ($sc-dispatch tmp '(_ each-any any . #(each ((any . any) any))))))
+                 (if (if tmp-1
+                       (apply (lambda (k docstring keyword pattern template)
+                                (string? (syntax->datum docstring)))
+                              tmp-1)
+                       #f)
+                   (apply (lambda (k docstring keyword pattern template)
+                            (expand-syntax-rules
+                              #f
+                              k
+                              (list docstring)
+                              (map (lambda (tmp-2 tmp-1 tmp) (list (cons tmp tmp-1) tmp-2))
+                                   template
+                                   pattern
+                                   keyword)))
+                          tmp-1)
+                   (let ((tmp-1 ($sc-dispatch tmp '(_ any each-any . #(each ((any . any) any))))))
+                     (if (if tmp-1
+                           (apply (lambda (dots k keyword pattern template) (identifier? dots))
+                                  tmp-1)
+                           #f)
+                       (apply (lambda (dots k keyword pattern template)
+                                (expand-syntax-rules
+                                  dots
+                                  k
+                                  '()
+                                  (map (lambda (tmp-2 tmp-1 tmp) (list (cons tmp tmp-1) tmp-2))
+                                       template
+                                       pattern
+                                       keyword)))
+                              tmp-1)
+                       (let ((tmp-1 ($sc-dispatch tmp '(_ any each-any any . #(each ((any . any) any))))))
+                         (if (if tmp-1
+                               (apply (lambda (dots k docstring keyword pattern template)
+                                        (if (identifier? dots) (string? (syntax->datum docstring)) #f))
+                                      tmp-1)
+                               #f)
+                           (apply (lambda (dots k docstring keyword pattern template)
+                                    (expand-syntax-rules
+                                      dots
+                                      k
+                                      (list docstring)
+                                      (map (lambda (tmp-2 tmp-1 tmp) (list (cons tmp tmp-1) tmp-2))
+                                           template
+                                           pattern
+                                           keyword)))
+                                  tmp-1)
+                           (syntax-violation
+                             #f
+                             "source expression failed to match any pattern"
+                             tmp))))))))))))))
  (define define-syntax-rule
    (make-syntax-transformer
      'define-syntax-rule
          (if (null? r)
              '()
              (let ((a (car r)))
-               (if (memq (cadr a) '(macro syntax-parameter))
 -              (if (memq (cadr a) '(macro ellipsis))
++              (if (memq (cadr a) '(macro syntax-parameter ellipsis))
                    (cons a (macros-only-env (cdr r)))
                    (macros-only-env (cdr r)))))))
  
      ;;
      (define expand-top-sequence
        (lambda (body r w s m esew mod)
 -        (define (scan body r w s m esew mod exps)
 -          (cond
 -           ((null? body)
 -            ;; in reversed order
 -            exps)
 -           (else
 +        (let* ((r (cons '("placeholder" . (placeholder)) r))
 +               (ribcage (make-empty-ribcage))
 +               (w (make-wrap (wrap-marks w) (cons ribcage (wrap-subst w)))))
 +          (define (record-definition! id var)
 +            (let ((mod (cons 'hygiene (module-name (current-module)))))
 +              ;; Ribcages map symbol+marks to names, mostly for
 +              ;; resolving lexicals.  Here to add a mapping for toplevel
 +              ;; definitions we also need to match the module.  So, we
 +              ;; put it in the name instead, and make id-var-name handle
 +              ;; the special case of names that are pairs.  See the
 +              ;; comments in id-var-name for more.
 +              (extend-ribcage! ribcage id
 +                               (cons (syntax-object-module id)
 +                                     (wrap var top-wrap mod)))))
 +          (define (macro-introduced-identifier? id)
 +            (not (equal? (wrap-marks (syntax-object-wrap id)) '(top))))
 +          (define (fresh-derived-name id orig-form)
 +            (symbol-append
 +             (syntax-object-expression id)
 +             '-
 +             (string->symbol
 +              ;; FIXME: `hash' currently stops descending into nested
 +              ;; data at some point, so it's less unique than we would
 +              ;; like.  Also this encodes hash values into the ABI of
 +              ;; compiled modules; a problem?
 +              (number->string
 +               (hash (syntax->datum orig-form) most-positive-fixnum)
 +               16))))
 +          (define (parse body r w s m esew mod)
 +            (let lp ((body body) (exps '()))
 +              (if (null? body)
 +                  exps
 +                  (lp (cdr body)
 +                      (append (parse1 (car body) r w s m esew mod)
 +                              exps)))))
 +          (define (parse1 x r w s m esew mod)
              (call-with-values
                  (lambda ()
 -                  (call-with-values
 -                      (lambda ()
 -                        (let ((e (car body)))
 -                          (syntax-type e r w (or (source-annotation e) s) #f mod #f)))
 -                    (lambda (type value form e w s mod)
 -                      (case type
 -                        ((begin-form)
 -                         (syntax-case e ()
 -                           ((_) exps)
 -                           ((_ e1 e2 ...)
 -                            (scan #'(e1 e2 ...) r w s m esew mod exps))))
 -                        ((local-syntax-form)
 -                         (expand-local-syntax value e r w s mod
 -                                              (lambda (body r w s mod)
 -                                                (scan body r w s m esew mod exps))))
 -                        ((eval-when-form)
 -                         (syntax-case e ()
 -                           ((_ (x ...) e1 e2 ...)
 -                            (let ((when-list (parse-when-list e #'(x ...)))
 -                                  (body #'(e1 e2 ...)))
 -                              (cond
 -                               ((eq? m 'e)
 -                                (if (memq 'eval when-list)
 -                                    (scan body r w s
 -                                          (if (memq 'expand when-list) 'c&e 'e)
 -                                          '(eval)
 -                                          mod exps)
 -                                    (begin
 -                                      (if (memq 'expand when-list)
 -                                          (top-level-eval-hook
 -                                           (expand-top-sequence body r w s 'e '(eval) mod)
 -                                           mod))
 -                                      (values exps))))
 -                               ((memq 'load when-list)
 -                                (if (or (memq 'compile when-list)
 -                                        (memq 'expand when-list)
 -                                        (and (eq? m 'c&e) (memq 'eval when-list)))
 -                                    (scan body r w s 'c&e '(compile load) mod exps)
 -                                    (if (memq m '(c c&e))
 -                                        (scan body r w s 'c '(load) mod exps)
 -                                        (values exps))))
 -                               ((or (memq 'compile when-list)
 -                                    (memq 'expand when-list)
 -                                    (and (eq? m 'c&e) (memq 'eval when-list)))
 -                                (top-level-eval-hook
 -                                 (expand-top-sequence body r w s 'e '(eval) mod)
 -                                 mod)
 -                                (values exps))
 -                               (else
 -                                (values exps)))))))
 -                        ((define-syntax-form define-syntax-parameter-form)
 -                         (let ((n (id-var-name value w)) (r (macros-only-env r)))
 -                           (case m
 -                             ((c)
 -                              (if (memq 'compile esew)
 -                                  (let ((e (expand-install-global n (expand e r w mod))))
 -                                    (top-level-eval-hook e mod)
 -                                    (if (memq 'load esew)
 -                                        (values (cons e exps))
 -                                        (values exps)))
 -                                  (if (memq 'load esew)
 -                                      (values (cons (expand-install-global n (expand e r w mod))
 -                                                    exps))
 -                                      (values exps))))
 -                             ((c&e)
 -                              (let ((e (expand-install-global n (expand e r w mod))))
 -                                (top-level-eval-hook e mod)
 -                                (values (cons e exps))))
 -                             (else
 -                              (if (memq 'eval esew)
 -                                  (top-level-eval-hook
 -                                   (expand-install-global n (expand e r w mod))
 -                                   mod))
 -                              (values exps)))))
 -                        ((define-form)
 -                         (let* ((n (id-var-name value w))
 -                                ;; Lookup the name in the module of the define form.
 -                                (type (binding-type (lookup n r mod))))
 -                           (case type
 -                             ((global core macro module-ref)
 -                              ;; affect compile-time environment (once we have booted)
 -                              (if (and (memq m '(c c&e))
 -                                       (not (module-local-variable (current-module) n))
 -                                       (current-module))
 -                                  (let ((old (module-variable (current-module) n)))
 -                                    ;; use value of the same-named imported variable, if
 -                                    ;; any
 -                                    (if (and (variable? old)
 -                                             (variable-bound? old)
 -                                             (not (macro? (variable-ref old))))
 -                                        (module-define! (current-module) n (variable-ref old))
 -                                        (module-add! (current-module) n (make-undefined-variable)))))
 -                              (values
 -                               (cons
 -                                (if (eq? m 'c&e)
 -                                    (let ((x (build-global-definition s n (expand e r w mod))))
 -                                      (top-level-eval-hook x mod)
 -                                      x)
 -                                    (lambda ()
 -                                      (build-global-definition s n (expand e r w mod))))
 -                                exps)))
 -                             ((displaced-lexical)
 -                              (syntax-violation #f "identifier out of context"
 -                                                (source-wrap form w s mod)
 -                                                (wrap value w mod)))
 -                             (else
 -                              (syntax-violation #f "cannot define keyword at top level"
 -                                                (source-wrap form w s mod)
 -                                                (wrap value w mod))))))
 -                        (else
 -                         (values (cons
 -                                  (if (eq? m 'c&e)
 -                                      (let ((x (expand-expr type value form e r w s mod)))
 -                                        (top-level-eval-hook x mod)
 -                                        x)
 -                                      (lambda ()
 -                                        (expand-expr type value form e r w s mod)))
 -                                  exps)))))))
 -              (lambda (exps)
 -                (scan (cdr body) r w s m esew mod exps))))))
 -
 -        (call-with-values (lambda ()
 -                            (scan body r w s m esew mod '()))
 -          (lambda (exps)
 +                  (syntax-type x r w (source-annotation x) ribcage mod #f))
 +              (lambda (type value form e w s mod)
 +                (case type
 +                  ((define-form)
 +                   (let* ((id (wrap value w mod))
 +                          (label (gen-label))
 +                          (var (if (macro-introduced-identifier? id)
 +                                   (fresh-derived-name id x)
 +                                   (syntax-object-expression id))))
 +                     (record-definition! id var)
 +                     (list
 +                      (if (eq? m 'c&e)
 +                          (let ((x (build-global-definition s var (expand e r w mod))))
 +                            (top-level-eval-hook x mod)
 +                            (lambda () x))
-                           (lambda ()
-                             (build-global-definition s var (expand e r w mod)))))))
++                          (call-with-values
++                              (lambda () (resolve-identifier id empty-wrap r mod #t))
++                            (lambda (type* value* mod*)
++                              ;; If the identifier to be bound is currently bound to a
++                              ;; macro, then immediately discard that binding.
++                              (if (eq? type* 'macro)
++                                  (top-level-eval-hook (build-global-definition
++                                                        s var (build-void s))
++                                                       mod))
++                              (lambda ()
++                                (build-global-definition s var (expand e r w mod)))))))))
 +                  ((define-syntax-form define-syntax-parameter-form)
 +                   (let* ((id (wrap value w mod))
 +                          (label (gen-label))
 +                          (var (if (macro-introduced-identifier? id)
 +                                   (fresh-derived-name id x)
 +                                   (syntax-object-expression id))))
 +                     (record-definition! id var)
 +                     (case m
 +                       ((c)
 +                        (cond
 +                         ((memq 'compile esew)
 +                          (let ((e (expand-install-global var type (expand e r w mod))))
 +                            (top-level-eval-hook e mod)
 +                            (if (memq 'load esew)
 +                                (list (lambda () e))
 +                                '())))
 +                         ((memq 'load esew)
 +                          (list (lambda ()
 +                                  (expand-install-global var type (expand e r w mod)))))
 +                         (else '())))
 +                       ((c&e)
 +                        (let ((e (expand-install-global var type (expand e r w mod))))
 +                          (top-level-eval-hook e mod)
 +                          (list (lambda () e))))
 +                       (else
 +                        (if (memq 'eval esew)
 +                            (top-level-eval-hook
 +                             (expand-install-global var type (expand e r w mod))
 +                             mod))
 +                        '()))))
 +                  ((begin-form)
 +                   (syntax-case e ()
 +                     ((_ e1 ...)
 +                      (parse #'(e1 ...) r w s m esew mod))))
 +                  ((local-syntax-form)
 +                   (expand-local-syntax value e r w s mod
-                                      (lambda (forms r w s mod)
-                                        (parse forms r w s m esew mod))))
++                                        (lambda (forms r w s mod)
++                                          (parse forms r w s m esew mod))))
 +                  ((eval-when-form)
 +                   (syntax-case e ()
 +                     ((_ (x ...) e1 e2 ...)
 +                      (let ((when-list (parse-when-list e #'(x ...)))
 +                            (body #'(e1 e2 ...)))
 +                        (define (recurse m esew)
 +                          (parse body r w s m esew mod))
 +                        (cond
 +                         ((eq? m 'e)
 +                          (if (memq 'eval when-list)
 +                              (recurse (if (memq 'expand when-list) 'c&e 'e)
 +                                       '(eval))
 +                              (begin
 +                                (if (memq 'expand when-list)
 +                                    (top-level-eval-hook
 +                                     (expand-top-sequence body r w s 'e '(eval) mod)
 +                                     mod))
 +                                '())))
 +                         ((memq 'load when-list)
 +                          (if (or (memq 'compile when-list)
 +                                  (memq 'expand when-list)
 +                                  (and (eq? m 'c&e) (memq 'eval when-list)))
 +                              (recurse 'c&e '(compile load))
 +                              (if (memq m '(c c&e))
 +                                  (recurse 'c '(load))
 +                                  '())))
 +                         ((or (memq 'compile when-list)
 +                              (memq 'expand when-list)
 +                              (and (eq? m 'c&e) (memq 'eval when-list)))
 +                          (top-level-eval-hook
 +                           (expand-top-sequence body r w s 'e '(eval) mod)
 +                           mod)
 +                          '())
 +                         (else
 +                          '()))))))
 +                  (else
 +                   (list
 +                    (if (eq? m 'c&e)
 +                        (let ((x (expand-expr type value form e r w s mod)))
 +                          (top-level-eval-hook x mod)
 +                          (lambda () x))
 +                        (lambda ()
 +                          (expand-expr type value form e r w s mod)))))))))
 +          (let ((exps (map (lambda (x) (x))
 +                           (reverse (parse body r w s m esew mod)))))
              (if (null? exps)
                  (build-void s)
 -                (build-sequence
 -                 s
 -                 (let lp ((in exps) (out '()))
 -                   (if (null? in) out
 -                       (let ((e (car in)))
 -                         (lp (cdr in)
 -                             (cons (if (procedure? e) (e) e) out)))))))))))
 +                (build-sequence s exps))))))
      
      (define expand-install-global
 -      (lambda (name e)
 +      (lambda (name type e)
          (build-global-definition
           no-source
           name
          (build-void no-source)))
  
      (define ellipsis?
-       (lambda (x)
-         (and (nonsymbol-id? x)
-              (free-id=? x #'(... ...)))))
+       (lambda (e r mod)
+         (and (nonsymbol-id? e)
+              ;; If there is a binding for the special identifier
+              ;; #{ $sc-ellipsis }# in the lexical environment of E,
+              ;; and if the associated binding type is 'ellipsis',
+              ;; then the binding's value specifies the custom ellipsis
+              ;; identifier within that lexical environment, and the
+              ;; comparison is done using 'bound-id=?'.
 -             (let* ((id (make-syntax-object '#{ $sc-ellipsis }#
 -                                            (syntax-object-wrap e)
 -                                            (syntax-object-module e)))
 -                    (n (id-var-name id empty-wrap))
 -                    (b (lookup n r mod)))
 -               (if (eq? (binding-type b) 'ellipsis)
 -                   (bound-id=? e (binding-value b))
 -                   (free-id=? e #'(... ...)))))))
++             (call-with-values
++                 (lambda () (resolve-identifier
++                             (make-syntax-object '#{ $sc-ellipsis }#
++                                                 (syntax-object-wrap e)
++                                                 (syntax-object-module e))
++                             empty-wrap r mod #f))
++               (lambda (type value mod)
++                 (if (eq? type 'ellipsis)
++                     (bound-id=? e value)
++                     (free-id=? e #'(... ...))))))))
  
      (define lambda-formals
        (lambda (orig-args)
                         (_ (syntax-violation 'quote "bad syntax"
                                              (source-wrap e w s mod))))))
  
 -    (global-extend 'core 'syntax
 -                   (let ()
 -                     (define gen-syntax
 -                       (lambda (src e r maps ellipsis? mod)
 -                         (if (id? e)
 -                             (let ((label (id-var-name e empty-wrap)))
 -                               ;; Mod does not matter, we are looking to see if
 -                               ;; the id is lexical syntax.
 -                               (let ((b (lookup label r mod)))
 -                                 (if (eq? (binding-type b) 'syntax)
 -                                     (call-with-values
 -                                         (lambda ()
 -                                           (let ((var.lev (binding-value b)))
 -                                             (gen-ref src (car var.lev) (cdr var.lev) maps)))
 -                                       (lambda (var maps) (values `(ref ,var) maps)))
 -                                     (if (ellipsis? e r mod)
 -                                         (syntax-violation 'syntax "misplaced ellipsis" src)
 -                                         (values `(quote ,e) maps)))))
 -                             (syntax-case e ()
 -                               ((dots e)
 -                                (ellipsis? #'dots r mod)
 -                                (gen-syntax src #'e r maps (lambda (e r mod) #f) mod))
 -                               ((x dots . y)
 -                                ;; this could be about a dozen lines of code, except that we
 -                                ;; choose to handle #'(x ... ...) forms
 -                                (ellipsis? #'dots r mod)
 -                                (let f ((y #'y)
 -                                        (k (lambda (maps)
 -                                             (call-with-values
 -                                                 (lambda ()
 -                                                   (gen-syntax src #'x r
 -                                                               (cons '() maps) ellipsis? mod))
 -                                               (lambda (x maps)
 -                                                 (if (null? (car maps))
 -                                                     (syntax-violation 'syntax "extra ellipsis"
 -                                                                       src)
 -                                                     (values (gen-map x (car maps))
 -                                                             (cdr maps))))))))
 -                                  (syntax-case y ()
 -                                    ((dots . y)
 -                                     (ellipsis? #'dots r mod)
 -                                     (f #'y
 -                                        (lambda (maps)
 -                                          (call-with-values
 -                                              (lambda () (k (cons '() maps)))
 -                                            (lambda (x maps)
 -                                              (if (null? (car maps))
 -                                                  (syntax-violation 'syntax "extra ellipsis" src)
 -                                                  (values (gen-mappend x (car maps))
 -                                                          (cdr maps))))))))
 -                                    (_ (call-with-values
 -                                           (lambda () (gen-syntax src y r maps ellipsis? mod))
 -                                         (lambda (y maps)
 -                                           (call-with-values
 -                                               (lambda () (k maps))
 -                                             (lambda (x maps)
 -                                               (values (gen-append x y) maps)))))))))
 -                               ((x . y)
 -                                (call-with-values
 -                                    (lambda () (gen-syntax src #'x r maps ellipsis? mod))
 -                                  (lambda (x maps)
 -                                    (call-with-values
 -                                        (lambda () (gen-syntax src #'y r maps ellipsis? mod))
 -                                      (lambda (y maps) (values (gen-cons x y) maps))))))
 -                               (#(e1 e2 ...)
 -                                (call-with-values
 -                                    (lambda ()
 -                                      (gen-syntax src #'(e1 e2 ...) r maps ellipsis? mod))
 -                                  (lambda (e maps) (values (gen-vector e) maps))))
 -                               (_ (values `(quote ,e) maps))))))
 -
 -                     (define gen-ref
 -                       (lambda (src var level maps)
 -                         (if (fx= level 0)
 -                             (values var maps)
 -                             (if (null? maps)
 -                                 (syntax-violation 'syntax "missing ellipsis" src)
 -                                 (call-with-values
 -                                     (lambda () (gen-ref src var (fx- level 1) (cdr maps)))
 -                                   (lambda (outer-var outer-maps)
 -                                     (let ((b (assq outer-var (car maps))))
 -                                       (if b
 -                                           (values (cdr b) maps)
 -                                           (let ((inner-var (gen-var 'tmp)))
 -                                             (values inner-var
 -                                                     (cons (cons (cons outer-var inner-var)
 -                                                                 (car maps))
 -                                                           outer-maps)))))))))))
 -
 -                     (define gen-mappend
 -                       (lambda (e map-env)
 -                         `(apply (primitive append) ,(gen-map e map-env))))
 -
 -                     (define gen-map
 -                       (lambda (e map-env)
 -                         (let ((formals (map cdr map-env))
 -                               (actuals (map (lambda (x) `(ref ,(car x))) map-env)))
 -                           (cond
 -                            ((eq? (car e) 'ref)
 -                             ;; identity map equivalence:
 -                             ;; (map (lambda (x) x) y) == y
 -                             (car actuals))
 -                            ((and-map
 -                              (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals)))
 -                              (cdr e))
 -                             ;; eta map equivalence:
 -                             ;; (map (lambda (x ...) (f x ...)) y ...) == (map f y ...)
 -                             `(map (primitive ,(car e))
 -                                   ,@(map (let ((r (map cons formals actuals)))
 -                                            (lambda (x) (cdr (assq (cadr x) r))))
 -                                          (cdr e))))
 -                            (else `(map (lambda ,formals ,e) ,@actuals))))))
 -
 -                     (define gen-cons
 -                       (lambda (x y)
 -                         (case (car y)
 -                           ((quote)
 -                            (if (eq? (car x) 'quote)
 -                                `(quote (,(cadr x) . ,(cadr y)))
 -                                (if (eq? (cadr y) '())
 -                                    `(list ,x)
 -                                    `(cons ,x ,y))))
 -                           ((list) `(list ,x ,@(cdr y)))
 -                           (else `(cons ,x ,y)))))
 -
 -                     (define gen-append
 -                       (lambda (x y)
 -                         (if (equal? y '(quote ()))
 -                             x
 -                             `(append ,x ,y))))
 -
 -                     (define gen-vector
 -                       (lambda (x)
 -                         (cond
 -                          ((eq? (car x) 'list) `(vector ,@(cdr x)))
 -                          ((eq? (car x) 'quote) `(quote #(,@(cadr x))))
 -                          (else `(list->vector ,x)))))
 -
 -
 -                     (define regen
 -                       (lambda (x)
 -                         (case (car x)
 -                           ((ref) (build-lexical-reference 'value no-source (cadr x) (cadr x)))
 -                           ((primitive) (build-primref no-source (cadr x)))
 -                           ((quote) (build-data no-source (cadr x)))
 -                           ((lambda)
 -                            (if (list? (cadr x))
 -                                (build-simple-lambda no-source (cadr x) #f (cadr x) '() (regen (caddr x)))
 -                                (error "how did we get here" x)))
 -                           (else (build-application no-source
 -                                                    (build-primref no-source (car x))
 -                                                    (map regen (cdr x)))))))
 -
 -                     (lambda (e r w s mod)
 -                       (let ((e (source-wrap e w s mod)))
 -                         (syntax-case e ()
 -                           ((_ x)
 +    (global-extend
 +     'core 'syntax
 +     (let ()
 +       (define gen-syntax
 +         (lambda (src e r maps ellipsis? mod)
 +           (if (id? e)
 +               (call-with-values (lambda ()
 +                                   (resolve-identifier e empty-wrap r mod #f))
 +                 (lambda (type value mod)
 +                   (case type
 +                     ((syntax)
 +                      (call-with-values
 +                          (lambda () (gen-ref src (car value) (cdr value) maps))
 +                        (lambda (var maps)
 +                          (values `(ref ,var) maps))))
 +                     (else
-                       (if (ellipsis? e)
++                      (if (ellipsis? e r mod)
 +                          (syntax-violation 'syntax "misplaced ellipsis" src)
 +                          (values `(quote ,e) maps))))))
 +               (syntax-case e ()
 +                 ((dots e)
-                   (ellipsis? #'dots)
-                   (gen-syntax src #'e r maps (lambda (x) #f) mod))
++                  (ellipsis? #'dots r mod)
++                  (gen-syntax src #'e r maps (lambda (e r mod) #f) mod))
 +                 ((x dots . y)
 +                  ;; this could be about a dozen lines of code, except that we
 +                  ;; choose to handle #'(x ... ...) forms
-                   (ellipsis? #'dots)
++                  (ellipsis? #'dots r mod)
 +                  (let f ((y #'y)
 +                          (k (lambda (maps)
 +                               (call-with-values
 +                                   (lambda ()
 +                                     (gen-syntax src #'x r
 +                                                 (cons '() maps) ellipsis? mod))
 +                                 (lambda (x maps)
 +                                   (if (null? (car maps))
 +                                       (syntax-violation 'syntax "extra ellipsis"
 +                                                         src)
 +                                       (values (gen-map x (car maps))
 +                                               (cdr maps))))))))
 +                    (syntax-case y ()
 +                      ((dots . y)
-                        (ellipsis? #'dots)
++                       (ellipsis? #'dots r mod)
 +                       (f #'y
 +                          (lambda (maps)
                              (call-with-values
 -                                (lambda () (gen-syntax e #'x r '() ellipsis? mod))
 -                              (lambda (e maps) (regen e))))
 -                           (_ (syntax-violation 'syntax "bad `syntax' form" e)))))))
 +                                (lambda () (k (cons '() maps)))
 +                              (lambda (x maps)
 +                                (if (null? (car maps))
 +                                    (syntax-violation 'syntax "extra ellipsis" src)
 +                                    (values (gen-mappend x (car maps))
 +                                            (cdr maps))))))))
 +                      (_ (call-with-values
 +                             (lambda () (gen-syntax src y r maps ellipsis? mod))
 +                           (lambda (y maps)
 +                             (call-with-values
 +                                 (lambda () (k maps))
 +                               (lambda (x maps)
 +                                 (values (gen-append x y) maps)))))))))
 +                 ((x . y)
 +                  (call-with-values
 +                      (lambda () (gen-syntax src #'x r maps ellipsis? mod))
 +                    (lambda (x maps)
 +                      (call-with-values
 +                          (lambda () (gen-syntax src #'y r maps ellipsis? mod))
 +                        (lambda (y maps) (values (gen-cons x y) maps))))))
 +                 (#(e1 e2 ...)
 +                  (call-with-values
 +                      (lambda ()
 +                        (gen-syntax src #'(e1 e2 ...) r maps ellipsis? mod))
 +                    (lambda (e maps) (values (gen-vector e) maps))))
 +                 (_ (values `(quote ,e) maps))))))
 +
 +       (define gen-ref
 +         (lambda (src var level maps)
 +           (if (fx= level 0)
 +               (values var maps)
 +               (if (null? maps)
 +                   (syntax-violation 'syntax "missing ellipsis" src)
 +                   (call-with-values
 +                       (lambda () (gen-ref src var (fx- level 1) (cdr maps)))
 +                     (lambda (outer-var outer-maps)
 +                       (let ((b (assq outer-var (car maps))))
 +                         (if b
 +                             (values (cdr b) maps)
 +                             (let ((inner-var (gen-var 'tmp)))
 +                               (values inner-var
 +                                       (cons (cons (cons outer-var inner-var)
 +                                                   (car maps))
 +                                             outer-maps)))))))))))
 +
 +       (define gen-mappend
 +         (lambda (e map-env)
 +           `(apply (primitive append) ,(gen-map e map-env))))
 +
 +       (define gen-map
 +         (lambda (e map-env)
 +           (let ((formals (map cdr map-env))
 +                 (actuals (map (lambda (x) `(ref ,(car x))) map-env)))
 +             (cond
 +              ((eq? (car e) 'ref)
 +               ;; identity map equivalence:
 +               ;; (map (lambda (x) x) y) == y
 +               (car actuals))
 +              ((and-map
 +                (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals)))
 +                (cdr e))
 +               ;; eta map equivalence:
 +               ;; (map (lambda (x ...) (f x ...)) y ...) == (map f y ...)
 +               `(map (primitive ,(car e))
 +                     ,@(map (let ((r (map cons formals actuals)))
 +                              (lambda (x) (cdr (assq (cadr x) r))))
 +                            (cdr e))))
 +              (else `(map (lambda ,formals ,e) ,@actuals))))))
 +
 +       (define gen-cons
 +         (lambda (x y)
 +           (case (car y)
 +             ((quote)
 +              (if (eq? (car x) 'quote)
 +                  `(quote (,(cadr x) . ,(cadr y)))
 +                  (if (eq? (cadr y) '())
 +                      `(list ,x)
 +                      `(cons ,x ,y))))
 +             ((list) `(list ,x ,@(cdr y)))
 +             (else `(cons ,x ,y)))))
 +
 +       (define gen-append
 +         (lambda (x y)
 +           (if (equal? y '(quote ()))
 +               x
 +               `(append ,x ,y))))
 +
 +       (define gen-vector
 +         (lambda (x)
 +           (cond
 +            ((eq? (car x) 'list) `(vector ,@(cdr x)))
 +            ((eq? (car x) 'quote) `(quote #(,@(cadr x))))
 +            (else `(list->vector ,x)))))
 +
 +
 +       (define regen
 +         (lambda (x)
 +           (case (car x)
 +             ((ref) (build-lexical-reference 'value no-source (cadr x) (cadr x)))
 +             ((primitive) (build-primref no-source (cadr x)))
 +             ((quote) (build-data no-source (cadr x)))
 +             ((lambda)
 +              (if (list? (cadr x))
 +                  (build-simple-lambda no-source (cadr x) #f (cadr x) '() (regen (caddr x)))
 +                  (error "how did we get here" x)))
 +             (else (build-primcall no-source (car x) (map regen (cdr x)))))))
 +
 +       (lambda (e r w s mod)
 +         (let ((e (source-wrap e w s mod)))
 +           (syntax-case e ()
 +             ((_ x)
 +              (call-with-values
 +                  (lambda () (gen-syntax e #'x r '() ellipsis? mod))
 +                (lambda (e maps) (regen e))))
 +             (_ (syntax-violation 'syntax "bad `syntax' form" e)))))))
  
      (global-extend 'core 'lambda
                     (lambda (e r w s mod)
                 (case type
                   ((lexical) (values 'lexical value))
                   ((macro) (values 'macro value))
 +                 ((syntax-parameter) (values 'syntax-parameter (car value)))
                   ((syntax) (values 'pattern-variable value))
                   ((displaced-lexical) (values 'displaced-lexical #f))
 -                 ((global) (values 'global (cons value (cdr mod))))
 +                 ((global)
 +                  (if (equal? mod '(primitive))
 +                      (values 'primitive value)
 +                      (values 'global (cons value (cdr mod)))))
+                  ((ellipsis)
+                   (values 'ellipsis
+                           (make-syntax-object (syntax-object-expression value)
+                                               (anti-mark (syntax-object-wrap value))
+                                               (syntax-object-module value))))
                   (else (values 'other #f))))))))
  
        (define (syntax-locally-bound-identifiers id)
Simple merge
@@@ -1,6 -1,6 +1,7 @@@
  ;;;; r6rs-ports.test --- R6RS I/O port tests.   -*- coding: utf-8; -*-
  ;;;;
- ;;;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
 -;;;; Copyright (C) 2009, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
++;;;; Copyright (C) 2009, 2010, 2011, 2012, 2013,
++;;;;   2014 Free Software Foundation, Inc.
  ;;;; Ludovic Courtès
  ;;;;
  ;;;; This library is free software; you can redistribute it and/or
Simple merge