1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

psyntax: Match when rebuilding macro output

* module/ice-9/psyntax.scm (expand-macro): Use match.
(eval-local-transformer): Use unless for side effect.
* module/ice-9/psyntax-pp.scm: Regenerate.
This commit is contained in:
Andy Wingo 2024-11-18 15:06:22 +01:00
parent b4aebbd7a5
commit 522b0b4510
2 changed files with 176 additions and 87 deletions

View file

@ -69,7 +69,7 @@
(build-call (lambda (sourcev fun-exp arg-exps) (make-call sourcev fun-exp arg-exps)))
(build-conditional
(lambda (sourcev test-exp then-exp else-exp) (make-conditional sourcev test-exp then-exp else-exp)))
(build-lexical-reference (lambda (type sourcev name var) (make-lexical-ref sourcev name var)))
(build-lexical-reference (lambda (sourcev name var) (make-lexical-ref sourcev name var)))
(build-lexical-assignment
(lambda (sourcev name var exp) (make-lexical-set sourcev name var (maybe-name-value name exp))))
(analyze-variable
@ -171,7 +171,7 @@
(list (maybe-name-value f-name proc))
(build-call
src
(build-lexical-reference 'fun src f-name f)
(build-lexical-reference src f-name f)
(map maybe-name-value ids val-exps)))))
(fk))))
(fk)))))
@ -645,14 +645,37 @@
(eq? i j))))
(valid-bound-ids?
(lambda (ids)
(and (let all-ids? ((ids ids)) (or (null? ids) (and (id? (car ids)) (all-ids? (cdr ids)))))
(and (let all-ids? ((ids ids))
(let* ((v ids)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((id vx) (ids vy)) (and (id? id) (all-ids? ids))))
(fk))))))
(if (null? v) #t (fk))))
(distinct-bound-ids? ids))))
(distinct-bound-ids?
(lambda (ids)
(let distinct? ((ids ids))
(or (null? ids) (and (not (bound-id-member? (car ids) (cdr ids))) (distinct? (cdr ids)))))))
(let* ((v ids)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((id vx) (ids vy)) (and (not (bound-id-member? id ids)) (distinct? ids))))
(fk))))))
(if (null? v) #t (fk))))))
(bound-id-member?
(lambda (x list) (and (not (null? list)) (or (bound-id=? x (car list)) (bound-id-member? x (cdr list))))))
(lambda (x ids)
(let* ((v ids)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((id vx) (ids vy)) (or (bound-id=? x id) (bound-id-member? x ids))))
(fk))))))
(if (null? v) #f (fk)))))
(wrap (lambda (x w defmod) (source-wrap x w #f defmod)))
(wrap-syntax
(lambda (x w defmod)
@ -668,10 +691,15 @@
(lambda (body r w s mod)
(build-sequence
s
(let dobody ((body body) (r r) (w w) (mod mod))
(if (null? body)
'()
(let ((first (expand (car body) r w mod))) (cons first (dobody (cdr body) r w mod))))))))
(let lp ((body body))
(let* ((v body)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((head vx) (tail vy) (expr (expand head r w mod))) (cons expr (lp tail))))
(fk))))))
(if (null? v) '() (fk)))))))
(expand-top-sequence
(lambda (body r w s m esew mod)
(let* ((r (cons '("placeholder" placeholder) r))
@ -688,9 +716,19 @@
(letrec* ((ribcage-has-var?
(lambda (var)
(let lp ((labels (ribcage-labels ribcage)))
(and (pair? labels)
(let ((wrapped (cdar labels)))
(or (eq? (syntax-expression wrapped) var) (lp (cdr labels)))))))))
(let* ((v labels)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy-1 (cdr v)))
(if (pair? vx)
(let ((vx (car vx)) (vy (cdr vx)))
(let* ((wrapped vy) (labels vy-1))
(or (eq? (syntax-expression wrapped) var)
(lp labels))))
(fk)))
(fk))))))
(if (null? v) #f (fk)))))))
(let lp ((unique var) (n 1))
(if (ribcage-has-var? unique)
(let ((tail (string->symbol (number->string n))))
@ -705,18 +743,31 @@
(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))))))
(let lp ((body body))
(let* ((v body)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((head vx)
(tail vy)
(thunks (parse1 head r w s m esew mod)))
(append thunks (lp tail))))
(fk))))))
(if (null? v) '() (fk))))))
(parse1
(lambda (x r w s m esew mod)
(letrec* ((current-module-for-expansion
(lambda (mod)
(let ((key (car mod)))
(if (memv key '(hygiene))
(let* ((v mod)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v)))) mod))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(if (eq? vx 'hygiene)
(cons 'hygiene (module-name (current-module)))
mod)))))
(fk)))
(fk))))))
(call-with-values
(lambda ()
(let ((mod (current-module-for-expansion mod)))
@ -832,8 +883,19 @@
(top-level-eval 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)))))))
(let* ((v (let lp ((thunks (parse body r w s m esew mod)))
(let* ((v thunks)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((thunk vx) (thunks vy)) (cons (thunk) (lp thunks))))
(fk))))))
(if (null? v) '() (fk)))))
(fk (lambda ()
(let* ((fk (lambda () (error "value failed to match" v))) (exps v))
(build-sequence s exps)))))
(if (null? v) (build-void s) (fk)))))))
(expand-install-global
(lambda (mod name type e)
(build-global-definition
@ -850,10 +912,29 @@
(lambda (e 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)))
(else (syntax-violation 'eval-when "invalid situation" e (car l))))))))
(let* ((v l)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((x vx)
(l vy)
(v x)
(fk (lambda ()
(let ((fk (lambda () (error "value failed to match" v))))
(syntax-violation 'eval-when "invalid situation" e x))))
(tk (lambda () (lp l))))
(if (eq? v 'compile)
(tk)
(let ((tk (lambda () (tk))))
(if (eq? v 'load)
(tk)
(let ((tk (lambda () (tk))))
(if (eq? v 'eval)
(tk)
(let ((tk (lambda () (tk)))) (if (eq? v 'expand) (tk) (fk))))))))))
(fk))))))
(if (null? v) result (fk)))))))
(syntax-type
(lambda (e r w s rib mod for-car?)
(cond
@ -960,18 +1041,14 @@
(lambda (type value form e r w s mod)
(let ((key type))
(cond
((memv key '(lexical)) (build-lexical-reference 'value s e value))
((memv key '(lexical)) (build-lexical-reference s e value))
((memv key '(core core-form)) (value e r w s mod))
((memv key '(module-ref))
(call-with-values (lambda () (value e r w mod)) (lambda (e r w s mod) (expand e r w mod))))
((memv key '(lexical-call))
(expand-call
(let ((id (car e)))
(build-lexical-reference
'fun
(source-annotation id)
(if (syntax? id) (syntax->datum id) id)
value))
(build-lexical-reference (source-annotation id) (if (syntax? id) (syntax->datum id) id) value))
e
r
w
@ -1035,7 +1112,17 @@
(lambda (p e r w s rib mod)
(letrec* ((decorate-source (lambda (x) (source-wrap x empty-wrap s #f)))
(map* (lambda (f x)
(cond ((null? x) x) ((pair? x) (cons (f (car x)) (map* f (cdr x)))) (else (f x)))))
(let* ((v x)
(fk (lambda ()
(let ((fk (lambda ()
(let* ((fk (lambda () (error "value failed to match" v)))
(x v))
(f x)))))
(if (pair? v)
(let ((vx (car v)) (vy (cdr v)))
(let* ((x vx) (x* vy)) (cons (f x) (map* f x*))))
(fk))))))
(if (null? v) '() (fk)))))
(rebuild-macro-output
(lambda (x m)
(cond
@ -1065,11 +1152,11 @@
(source-wrap e w (wrap-subst w) mod)
x))
(else (decorate-source x))))))
(let* ((t-680b775fb37a463-fef transformer-environment)
(t-680b775fb37a463-ff0 (lambda (k) (k e r w s rib mod))))
(let* ((t-680b775fb37a463-10d6 transformer-environment)
(t-680b775fb37a463-10d7 (lambda (k) (k e r w s rib mod))))
(with-fluid*
t-680b775fb37a463-fef
t-680b775fb37a463-ff0
t-680b775fb37a463-10d6
t-680b775fb37a463-10d7
(lambda () (rebuild-macro-output (p (source-wrap e (anti-mark w) s mod)) (new-mark))))))))
(expand-body
(lambda (body outer-form r w mod)
@ -1221,7 +1308,8 @@
(eval-local-transformer
(lambda (expanded mod)
(let ((p (local-eval expanded mod)))
(if (procedure? p) p (syntax-violation #f "nonprocedure transformer" p)))))
(if (not (procedure? p)) (syntax-violation #f "nonprocedure transformer" p))
p)))
(expand-void (lambda () (build-void #f)))
(ellipsis?
(lambda (e r mod)
@ -1599,11 +1687,11 @@
s
mod
get-formals
(map (lambda (tmp-680b775fb37a463-125d
tmp-680b775fb37a463-125c
tmp-680b775fb37a463-125b)
(cons tmp-680b775fb37a463-125b
(cons tmp-680b775fb37a463-125c tmp-680b775fb37a463-125d)))
(map (lambda (tmp-680b775fb37a463-1
tmp-680b775fb37a463
tmp-680b775fb37a463-135f)
(cons tmp-680b775fb37a463-135f
(cons tmp-680b775fb37a463 tmp-680b775fb37a463-1)))
e2*
e1*
args*)))
@ -1805,7 +1893,7 @@
(regen (lambda (x)
(let ((key (car x)))
(cond
((memv key '(ref)) (build-lexical-reference 'value #f (cadr x) (cadr x)))
((memv key '(ref)) (build-lexical-reference #f (cadr x) (cadr x)))
((memv key '(primitive)) (build-primref #f (cadr x)))
((memv key '(quote)) (build-data #f (cadr x)))
((memv key '(lambda))
@ -2262,7 +2350,7 @@
#f
(list y)
'()
(let ((y (build-lexical-reference 'value #f 'tmp y)))
(let ((y (build-lexical-reference #f 'tmp y)))
(build-conditional
#f
(let* ((tmp fender) (tmp ($sc-dispatch tmp '#(atom #t))))
@ -2331,7 +2419,7 @@
#f
(list x)
'()
(gen-syntax-case (build-lexical-reference 'value #f 'tmp x) key m r mod))
(gen-syntax-case (build-lexical-reference #f 'tmp x) key m r mod))
(list (expand val r empty-wrap mod))))
(syntax-violation 'syntax-case "invalid literals list" e)))
tmp)
@ -2698,8 +2786,9 @@
#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-147c tmp-680b775fb37a463-147b tmp-680b775fb37a463-147a)
(list (cons tmp-680b775fb37a463-147a tmp-680b775fb37a463-147b)
tmp-680b775fb37a463-147c))
template
pattern
keyword)))
@ -2714,8 +2803,8 @@
#f
k
(list docstring)
(map (lambda (tmp-680b775fb37a463-1 tmp-680b775fb37a463 tmp-680b775fb37a463-138f)
(list (cons tmp-680b775fb37a463-138f tmp-680b775fb37a463) tmp-680b775fb37a463-1))
(map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
(list (cons tmp-680b775fb37a463 tmp-680b775fb37a463-1) tmp-680b775fb37a463-2))
template
pattern
keyword)))
@ -2727,11 +2816,11 @@
dots
k
'()
(map (lambda (tmp-680b775fb37a463-13aa
tmp-680b775fb37a463-13a9
tmp-680b775fb37a463-13a8)
(list (cons tmp-680b775fb37a463-13a8 tmp-680b775fb37a463-13a9)
tmp-680b775fb37a463-13aa))
(map (lambda (tmp-680b775fb37a463-14ae
tmp-680b775fb37a463-14ad
tmp-680b775fb37a463-14ac)
(list (cons tmp-680b775fb37a463-14ac tmp-680b775fb37a463-14ad)
tmp-680b775fb37a463-14ae))
template
pattern
keyword)))
@ -2747,11 +2836,11 @@
dots
k
(list docstring)
(map (lambda (tmp-680b775fb37a463-13c9
tmp-680b775fb37a463-13c8
tmp-680b775fb37a463-13c7)
(list (cons tmp-680b775fb37a463-13c7 tmp-680b775fb37a463-13c8)
tmp-680b775fb37a463-13c9))
(map (lambda (tmp-680b775fb37a463-14cd
tmp-680b775fb37a463-14cc
tmp-680b775fb37a463-14cb)
(list (cons tmp-680b775fb37a463-14cb tmp-680b775fb37a463-14cc)
tmp-680b775fb37a463-14cd))
template
pattern
keyword)))
@ -2879,8 +2968,9 @@
(apply (lambda (p)
(if (= lev 0)
(quasilist*
(map (lambda (tmp-680b775fb37a463)
(list "value" tmp-680b775fb37a463))
(map (lambda (tmp-680b775fb37a463-157a)
(list "value"
tmp-680b775fb37a463-157a))
p)
(quasi q lev))
(quasicons
@ -2906,9 +2996,9 @@
(apply (lambda (p)
(if (= lev 0)
(quasiappend
(map (lambda (tmp-680b775fb37a463-147b)
(map (lambda (tmp-680b775fb37a463-157f)
(list "value"
tmp-680b775fb37a463-147b))
tmp-680b775fb37a463-157f))
p)
(quasi q lev))
(quasicons
@ -2965,8 +3055,8 @@
(apply (lambda (p)
(if (= lev 0)
(quasiappend
(map (lambda (tmp-680b775fb37a463)
(list "value" tmp-680b775fb37a463))
(map (lambda (tmp-680b775fb37a463-159a)
(list "value" tmp-680b775fb37a463-159a))
p)
(vquasi q lev))
(quasicons
@ -3048,8 +3138,8 @@
(let ((tmp-1 ls))
(let ((tmp ($sc-dispatch tmp-1 'each-any)))
(if tmp
(apply (lambda (t-680b775fb37a463-14df)
(cons "vector" t-680b775fb37a463-14df))
(apply (lambda (t-680b775fb37a463-15e3)
(cons "vector" t-680b775fb37a463-15e3))
tmp)
(syntax-violation
#f
@ -3059,8 +3149,8 @@
(let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") each-any))))
(if tmp-1
(apply (lambda (y)
(k (map (lambda (tmp-680b775fb37a463-14eb)
(list "quote" tmp-680b775fb37a463-14eb))
(k (map (lambda (tmp-680b775fb37a463-15ef)
(list "quote" tmp-680b775fb37a463-15ef))
y)))
tmp-1)
(let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
@ -3071,8 +3161,8 @@
(apply (lambda (y z) (f z (lambda (ls) (k (append y ls))))) tmp-1)
(let ((else tmp))
(let ((tmp x))
(let ((t-680b775fb37a463-14fa tmp))
(list "list->vector" t-680b775fb37a463-14fa)))))))))))))))))
(let ((t-680b775fb37a463-15fe tmp))
(list "list->vector" t-680b775fb37a463-15fe)))))))))))))))))
(emit (lambda (x)
(let ((tmp x))
(let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
@ -3084,9 +3174,9 @@
(let ((tmp-1 (map emit x)))
(let ((tmp ($sc-dispatch tmp-1 'each-any)))
(if tmp
(apply (lambda (t-680b775fb37a463)
(apply (lambda (t-680b775fb37a463-160d)
(cons (make-syntax 'list '((top)) '(hygiene guile))
t-680b775fb37a463))
t-680b775fb37a463-160d))
tmp)
(syntax-violation
#f
@ -3102,14 +3192,13 @@
(let ((tmp-1 (list (emit (car x*)) (f (cdr x*)))))
(let ((tmp ($sc-dispatch tmp-1 '(any any))))
(if tmp
(apply (lambda (t-680b775fb37a463-151d
t-680b775fb37a463-151c)
(apply (lambda (t-680b775fb37a463-1 t-680b775fb37a463)
(list (make-syntax
'cons
'((top))
'(hygiene guile))
t-680b775fb37a463-151d
t-680b775fb37a463-151c))
t-680b775fb37a463-1
t-680b775fb37a463))
tmp)
(syntax-violation
#f
@ -3122,12 +3211,12 @@
(let ((tmp-1 (map emit x)))
(let ((tmp ($sc-dispatch tmp-1 'each-any)))
(if tmp
(apply (lambda (t-680b775fb37a463)
(apply (lambda (t-680b775fb37a463-162d)
(cons (make-syntax
'append
'((top))
'(hygiene guile))
t-680b775fb37a463))
t-680b775fb37a463-162d))
tmp)
(syntax-violation
#f

View file

@ -1422,10 +1422,10 @@
(define (decorate-source x)
(source-wrap x empty-wrap s #f))
(define (map* f x)
(cond
((null? x) x)
((pair? x) (cons (f (car x)) (map* f (cdr x))))
(else (f x))))
(match x
(() '())
((x . x*) (cons (f x) (map* f x*)))
(x (f x))))
(define rebuild-macro-output
(lambda (x m)
(cond ((pair? x)
@ -1663,9 +1663,9 @@
(define (eval-local-transformer expanded mod)
(let ((p (local-eval expanded mod)))
(if (procedure? p)
p
(syntax-violation #f "nonprocedure transformer" p))))
(unless (procedure? p)
(syntax-violation #f "nonprocedure transformer" p))
p))
(define (expand-void)
(build-void no-source))