Merge pull request #870 from dpk/safe-syntax-case-macro-aux

Make macro-aux safe for other things together with syntax-case
This commit is contained in:
Alex Shinn 2022-10-30 13:43:28 +09:00 committed by GitHub
commit 4185012205
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 3 deletions

View file

@ -61,6 +61,10 @@
((letrec-syntax ((keyword transformer) ...) . body) ((letrec-syntax ((keyword transformer) ...) . body)
(%letrec-syntax ((keyword (make-transformer transformer)) ...) . body)))) (%letrec-syntax ((keyword (make-transformer transformer)) ...) . body))))
(define-record-type Pattern-Cell
(make-pattern-cell val) pattern-cell?
(val pattern-cell-value))
(define-syntax define-pattern-variable (define-syntax define-pattern-variable
(er-macro-transformer (er-macro-transformer
(lambda (expr rename compare) (lambda (expr rename compare)
@ -68,7 +72,7 @@
(binding (cddr expr))) (binding (cddr expr)))
(let ((cell (env-cell (current-usage-environment) id))) (let ((cell (env-cell (current-usage-environment) id)))
(if cell (if cell
(macro-aux-set! (cdr cell) binding))) (macro-aux-set! (cdr cell) (make-pattern-cell binding))))
(rename '(begin)))))) (rename '(begin))))))
(define (make-pattern-variable pvar) (define (make-pattern-variable pvar)
@ -76,8 +80,13 @@
(error "reference to pattern variable outside syntax" pvar))) (error "reference to pattern variable outside syntax" pvar)))
(define (pattern-variable x) (define (pattern-variable x)
(let ((cell (env-cell (current-usage-environment) x))) (and-let*
(and cell (macro? (cdr cell)) (macro-aux (cdr cell))))) ((cell (env-cell (current-usage-environment) x))
(cell-ref (cdr cell))
((macro? cell-ref))
(aux (macro-aux cell-ref))
((pattern-cell? aux)))
(pattern-cell-value aux)))
(define (rename id) (define (rename id)
((current-renamer) id)) ((current-renamer) id))

View file

@ -16,6 +16,8 @@
make-variable-transformer) make-variable-transformer)
(only (meta) environment) (only (meta) environment)
(srfi 1) (srfi 1)
(srfi 2)
(srfi 9)
(srfi 11) (srfi 11)
(srfi 39)) (srfi 39))
(include "syntax-case.scm")) (include "syntax-case.scm"))