mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-29 19:30:36 +02:00
psyntax: Add simple pattern matcher
* module/ice-9/psyntax.scm (simple-match1, simple-match-pat, simple-match-patv, match): Add simple pattern matcher. * module/ice-9/psyntax-pp.scm: Regenerate. Just different renumbering of temps.
This commit is contained in:
parent
d30b39e4ea
commit
d94292724b
2 changed files with 92 additions and 38 deletions
|
@ -794,11 +794,11 @@
|
|||
(source-wrap e w (cdr w) mod)
|
||||
x))
|
||||
(else (decorate-source x))))))
|
||||
(let* ((t-680b775fb37a463-d6f transformer-environment)
|
||||
(t-680b775fb37a463-d70 (lambda (k) (k e r w s rib mod))))
|
||||
(let* ((t-680b775fb37a463-e6b transformer-environment)
|
||||
(t-680b775fb37a463-e6c (lambda (k) (k e r w s rib mod))))
|
||||
(with-fluid*
|
||||
t-680b775fb37a463-d6f
|
||||
t-680b775fb37a463-d70
|
||||
t-680b775fb37a463-e6b
|
||||
t-680b775fb37a463-e6c
|
||||
(lambda () (rebuild-macro-output (p (source-wrap e (anti-mark w) s mod)) (new-mark))))))))
|
||||
(expand-body
|
||||
(lambda (body outer-form r w mod)
|
||||
|
@ -1328,11 +1328,11 @@
|
|||
s
|
||||
mod
|
||||
get-formals
|
||||
(map (lambda (tmp-680b775fb37a463-feb
|
||||
tmp-680b775fb37a463-fea
|
||||
tmp-680b775fb37a463-fe9)
|
||||
(cons tmp-680b775fb37a463-fe9
|
||||
(cons tmp-680b775fb37a463-fea tmp-680b775fb37a463-feb)))
|
||||
(map (lambda (tmp-680b775fb37a463-10e7
|
||||
tmp-680b775fb37a463-10e6
|
||||
tmp-680b775fb37a463-10e5)
|
||||
(cons tmp-680b775fb37a463-10e5
|
||||
(cons tmp-680b775fb37a463-10e6 tmp-680b775fb37a463-10e7)))
|
||||
e2*
|
||||
e1*
|
||||
args*)))
|
||||
|
@ -1600,8 +1600,8 @@
|
|||
(apply (lambda (args e1 e2)
|
||||
(build-it
|
||||
'()
|
||||
(map (lambda (tmp-680b775fb37a463-63b tmp-680b775fb37a463-63a tmp-680b775fb37a463)
|
||||
(cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-63a tmp-680b775fb37a463-63b)))
|
||||
(map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
|
||||
(cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-1 tmp-680b775fb37a463-2)))
|
||||
e2
|
||||
e1
|
||||
args)))
|
||||
|
@ -1611,8 +1611,9 @@
|
|||
(apply (lambda (docstring args e1 e2)
|
||||
(build-it
|
||||
(list (cons 'documentation (syntax->datum docstring)))
|
||||
(map (lambda (tmp-680b775fb37a463-1 tmp-680b775fb37a463 tmp-680b775fb37a463-64f)
|
||||
(cons tmp-680b775fb37a463-64f (cons tmp-680b775fb37a463 tmp-680b775fb37a463-1)))
|
||||
(map (lambda (tmp-680b775fb37a463-74d tmp-680b775fb37a463-74c tmp-680b775fb37a463-74b)
|
||||
(cons tmp-680b775fb37a463-74b
|
||||
(cons tmp-680b775fb37a463-74c tmp-680b775fb37a463-74d)))
|
||||
e2
|
||||
e1
|
||||
args)))
|
||||
|
@ -1632,8 +1633,8 @@
|
|||
(apply (lambda (args e1 e2)
|
||||
(build-it
|
||||
'()
|
||||
(map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
|
||||
(cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-1 tmp-680b775fb37a463-2)))
|
||||
(map (lambda (tmp-680b775fb37a463-1 tmp-680b775fb37a463 tmp-680b775fb37a463-6ff)
|
||||
(cons tmp-680b775fb37a463-6ff (cons tmp-680b775fb37a463 tmp-680b775fb37a463-1)))
|
||||
e2
|
||||
e1
|
||||
args)))
|
||||
|
@ -1643,8 +1644,8 @@
|
|||
(apply (lambda (docstring args e1 e2)
|
||||
(build-it
|
||||
(list (cons 'documentation (syntax->datum docstring)))
|
||||
(map (lambda (tmp-680b775fb37a463-61b tmp-680b775fb37a463-61a tmp-680b775fb37a463)
|
||||
(cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-61a tmp-680b775fb37a463-61b)))
|
||||
(map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
|
||||
(cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-1 tmp-680b775fb37a463-2)))
|
||||
e2
|
||||
e1
|
||||
args)))
|
||||
|
@ -2441,9 +2442,11 @@
|
|||
#f
|
||||
k
|
||||
(list docstring)
|
||||
(map (lambda (tmp-680b775fb37a463 tmp-680b775fb37a463-111f tmp-680b775fb37a463-111e)
|
||||
(list (cons tmp-680b775fb37a463-111e tmp-680b775fb37a463-111f)
|
||||
tmp-680b775fb37a463))
|
||||
(map (lambda (tmp-680b775fb37a463-121c
|
||||
tmp-680b775fb37a463-121b
|
||||
tmp-680b775fb37a463-121a)
|
||||
(list (cons tmp-680b775fb37a463-121a tmp-680b775fb37a463-121b)
|
||||
tmp-680b775fb37a463-121c))
|
||||
template
|
||||
pattern
|
||||
keyword)))
|
||||
|
@ -2632,9 +2635,9 @@
|
|||
(apply (lambda (p)
|
||||
(if (= lev 0)
|
||||
(quasiappend
|
||||
(map (lambda (tmp-680b775fb37a463-120a)
|
||||
(map (lambda (tmp-680b775fb37a463)
|
||||
(list "value"
|
||||
tmp-680b775fb37a463-120a))
|
||||
tmp-680b775fb37a463))
|
||||
p)
|
||||
(quasi q lev))
|
||||
(quasicons
|
||||
|
@ -2670,8 +2673,8 @@
|
|||
(apply (lambda (p)
|
||||
(if (= lev 0)
|
||||
(quasilist*
|
||||
(map (lambda (tmp-680b775fb37a463)
|
||||
(list "value" tmp-680b775fb37a463))
|
||||
(map (lambda (tmp-680b775fb37a463-131c)
|
||||
(list "value" tmp-680b775fb37a463-131c))
|
||||
p)
|
||||
(vquasi q lev))
|
||||
(quasicons
|
||||
|
@ -2774,8 +2777,8 @@
|
|||
(let ((tmp-1 ls))
|
||||
(let ((tmp ($sc-dispatch tmp-1 'each-any)))
|
||||
(if tmp
|
||||
(apply (lambda (t-680b775fb37a463-126e)
|
||||
(cons "vector" t-680b775fb37a463-126e))
|
||||
(apply (lambda (t-680b775fb37a463-136a)
|
||||
(cons "vector" t-680b775fb37a463-136a))
|
||||
tmp)
|
||||
(syntax-violation
|
||||
#f
|
||||
|
@ -2785,8 +2788,7 @@
|
|||
(let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") each-any))))
|
||||
(if tmp-1
|
||||
(apply (lambda (y)
|
||||
(k (map (lambda (tmp-680b775fb37a463-127a)
|
||||
(list "quote" tmp-680b775fb37a463-127a))
|
||||
(k (map (lambda (tmp-680b775fb37a463) (list "quote" tmp-680b775fb37a463))
|
||||
y)))
|
||||
tmp-1)
|
||||
(let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
|
||||
|
@ -2828,14 +2830,14 @@
|
|||
(let ((tmp-1 (list (emit (car x*)) (f (cdr x*)))))
|
||||
(let ((tmp ($sc-dispatch tmp-1 '(any any))))
|
||||
(if tmp
|
||||
(apply (lambda (t-680b775fb37a463-12ac
|
||||
t-680b775fb37a463-12ab)
|
||||
(apply (lambda (t-680b775fb37a463-13a8
|
||||
t-680b775fb37a463-13a7)
|
||||
(list (make-syntax
|
||||
'cons
|
||||
'((top))
|
||||
'(hygiene guile))
|
||||
t-680b775fb37a463-12ac
|
||||
t-680b775fb37a463-12ab))
|
||||
t-680b775fb37a463-13a8
|
||||
t-680b775fb37a463-13a7))
|
||||
tmp)
|
||||
(syntax-violation
|
||||
#f
|
||||
|
@ -2848,12 +2850,12 @@
|
|||
(let ((tmp-1 (map emit x)))
|
||||
(let ((tmp ($sc-dispatch tmp-1 'each-any)))
|
||||
(if tmp
|
||||
(apply (lambda (t-680b775fb37a463-12b8)
|
||||
(apply (lambda (t-680b775fb37a463-13b4)
|
||||
(cons (make-syntax
|
||||
'append
|
||||
'((top))
|
||||
'(hygiene guile))
|
||||
t-680b775fb37a463-12b8))
|
||||
t-680b775fb37a463-13b4))
|
||||
tmp)
|
||||
(syntax-violation
|
||||
#f
|
||||
|
@ -2866,12 +2868,12 @@
|
|||
(let ((tmp-1 (map emit x)))
|
||||
(let ((tmp ($sc-dispatch tmp-1 'each-any)))
|
||||
(if tmp
|
||||
(apply (lambda (t-680b775fb37a463-12c4)
|
||||
(apply (lambda (t-680b775fb37a463-13c0)
|
||||
(cons (make-syntax
|
||||
'vector
|
||||
'((top))
|
||||
'(hygiene guile))
|
||||
t-680b775fb37a463-12c4))
|
||||
t-680b775fb37a463-13c0))
|
||||
tmp)
|
||||
(syntax-violation
|
||||
#f
|
||||
|
@ -2882,12 +2884,12 @@
|
|||
(if tmp-1
|
||||
(apply (lambda (x)
|
||||
(let ((tmp (emit x)))
|
||||
(let ((t-680b775fb37a463-12d0 tmp))
|
||||
(let ((t-680b775fb37a463-13cc tmp))
|
||||
(list (make-syntax
|
||||
'list->vector
|
||||
'((top))
|
||||
'(hygiene guile))
|
||||
t-680b775fb37a463-12d0))))
|
||||
t-680b775fb37a463-13cc))))
|
||||
tmp-1)
|
||||
(let ((tmp-1 ($sc-dispatch tmp '(#(atom "value") any))))
|
||||
(if tmp-1
|
||||
|
|
|
@ -126,6 +126,58 @@
|
|||
(define-expansion-constructors)
|
||||
(define-expansion-accessors lambda src meta body)
|
||||
|
||||
;; A simple pattern matcher based on Oleg Kiselyov's pmatch.
|
||||
(define-syntax-rule (simple-match e cs ...)
|
||||
(let ((v e)) (simple-match-1 v cs ...)))
|
||||
|
||||
(define-syntax simple-match-1
|
||||
(syntax-rules ()
|
||||
((_ v) (error "value failed to match" v))
|
||||
((_ v (pat e0 e ...) cs ...)
|
||||
(let ((fk (lambda () (simple-match-1 v cs ...))))
|
||||
(simple-match-pat v pat (let () e0 e ...) (fk))))))
|
||||
|
||||
(define-syntax simple-match-patv
|
||||
(syntax-rules ()
|
||||
((_ v idx () kt kf) kt)
|
||||
((_ v idx (x . y) kt kf)
|
||||
(simple-match-pat (vector-ref v idx) x
|
||||
(simple-match-patv v (1+ idx) y kt kf)
|
||||
kf))))
|
||||
|
||||
(define-syntax simple-match-pat
|
||||
(syntax-rules (_ quote unquote ? and or not)
|
||||
((_ v _ kt kf) kt)
|
||||
((_ v () kt kf) (if (null? v) kt kf))
|
||||
((_ v #t kt kf) (if (eq? v #t) kt kf))
|
||||
((_ v #f kt kf) (if (eq? v #f) kt kf))
|
||||
((_ v (and) kt kf) kt)
|
||||
((_ v (and x . y) kt kf)
|
||||
(simple-match-pat v x (simple-match-pat v (and . y) kt kf) kf))
|
||||
((_ v (or) kt kf) kf)
|
||||
((_ v (or x . y) kt kf)
|
||||
(let ((tk (lambda () kt)))
|
||||
(simple-match-pat v x (tk) (simple-match-pat v (or . y) (tk) kf))))
|
||||
((_ v (not pat) kt kf) (simple-match-pat v pat kf kt))
|
||||
((_ v (quote lit) kt kf)
|
||||
(if (eq? v (quote lit)) kt kf))
|
||||
((_ v (? proc) kt kf) (simple-match-pat v (? proc _) kt kf))
|
||||
((_ v (? proc pat) kt kf)
|
||||
(if (proc v) (simple-match-pat v pat kt kf) kf))
|
||||
((_ v (x . y) kt kf)
|
||||
(if (pair? v)
|
||||
(let ((vx (car v)) (vy (cdr v)))
|
||||
(simple-match-pat vx x (simple-match-pat vy y kt kf) kf))
|
||||
kf))
|
||||
((_ v #(x ...) kt kf)
|
||||
(if (and (vector? v)
|
||||
(eq? (vector-length v) (length '(x ...))))
|
||||
(simple-match-patv v 0 (x ...) kt kf)
|
||||
kf))
|
||||
((_ v var kt kf) (let ((var v)) kt))))
|
||||
|
||||
(define-syntax-rule (match e cs ...) (simple-match e cs ...))
|
||||
|
||||
(define (top-level-eval x mod)
|
||||
(primitive-eval x))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue