Hex Artifact Content
Not logged in

Artifact dec381f80e4d5caf3fe2d62091331a7bbfb2aa0f:


0000: 3b 3b 20 4c 69 62 72 61 72 79 3a 20 73 78 6d 6c  ;; Library: sxml
0010: 2d 6d 61 74 63 68 0a 3b 3b 20 41 75 74 68 6f 72  -match.;; Author
0020: 3a 20 4a 69 6d 20 42 65 6e 64 65 72 0a 3b 3b 20  : Jim Bender.;; 
0030: 56 65 72 73 69 6f 6e 3a 20 31 2e 30 61 2c 20 50  Version: 1.0a, P
0040: 6f 72 74 61 62 6c 65 20 53 79 6e 74 61 78 2d 63  ortable Syntax-c
0050: 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  ase version for 
0060: 28 50 65 74 69 74 65 29 20 43 68 65 7a 20 53 63  (Petite) Chez Sc
0070: 68 65 6d 65 20 61 6e 64 20 53 49 53 43 0a 3b 3b  heme and SISC.;;
0080: 0a 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30  .;; Copyright 20
0090: 30 35 2c 20 4a 69 6d 20 42 65 6e 64 65 72 0a 3b  05, Jim Bender.;
00a0: 3b 20 73 78 6d 6c 2d 6d 61 74 63 68 20 69 73 20  ; sxml-match is 
00b0: 72 65 6c 65 61 73 65 64 20 75 6e 64 65 72 20 74  released under t
00c0: 68 65 20 4d 49 54 20 4c 69 63 65 6e 73 65 0a 3b  he MIT License.;
00d0: 3b 0a 28 6d 6f 64 75 6c 65 20 70 6f 72 74 61 62  ;.(module portab
00e0: 69 6c 69 74 79 20 28 6c 65 74 2f 65 63 29 0a 20  ility (let/ec). 
00f0: 20 0a 20 20 3b 20 75 6e 64 65 72 20 43 68 65 7a   .  ; under Chez
0100: 20 53 63 68 65 6d 65 20 61 6e 64 20 50 65 74 69   Scheme and Peti
0110: 74 65 20 43 68 65 7a 20 53 63 68 65 6d 65 2c 20  te Chez Scheme, 
0120: 75 73 65 20 63 61 6c 6c 2f 31 63 63 0a 20 20 28  use call/1cc.  (
0130: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6c 65  define-syntax le
0140: 74 2f 65 63 0a 20 20 20 20 28 73 79 6e 74 61 78  t/ec.    (syntax
0150: 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20  -rules ().      
0160: 5b 28 6c 65 74 2f 65 63 20 6e 61 6d 65 20 65 78  [(let/ec name ex
0170: 70 30 20 65 78 70 20 2e 2e 2e 29 0a 20 20 20 20  p0 exp ...).    
0180: 20 20 20 28 63 61 6c 6c 2f 31 63 63 20 28 6c 61     (call/1cc (la
0190: 6d 62 64 61 20 28 6e 61 6d 65 29 20 65 78 70 30  mbda (name) exp0
01a0: 20 65 78 70 20 2e 2e 2e 29 29 5d 29 29 0a 20 20   exp ...))])).  
01b0: 0a 20 20 29 0a 0a 0a 28 6d 6f 64 75 6c 65 20 73  .  )...(module s
01c0: 78 6d 6c 2d 61 63 63 65 73 73 6f 72 73 20 28 6e  xml-accessors (n
01d0: 6f 64 65 73 65 74 3f 0a 20 20 20 20 20 20 20 20  odeset?.        
01e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
01f0: 78 6d 6c 2d 65 6c 65 6d 65 6e 74 2d 74 61 67 0a  xml-element-tag.
0200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0210: 20 20 20 20 20 20 20 20 78 6d 6c 2d 65 6c 65 6d          xml-elem
0220: 65 6e 74 2d 61 74 74 72 69 62 75 74 65 73 0a 20  ent-attributes. 
0230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0240: 20 20 20 20 20 20 20 78 6d 6c 2d 65 6c 65 6d 65         xml-eleme
0250: 6e 74 2d 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  nt-contents.    
0260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0270: 20 20 20 20 6d 61 74 63 68 2d 78 6d 6c 2d 61 74      match-xml-at
0280: 74 72 69 62 75 74 65 0a 20 20 20 20 20 20 20 20  tribute.        
0290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02a0: 66 69 6c 74 65 72 2d 61 74 74 72 69 62 75 74 65  filter-attribute
02b0: 73 29 0a 20 20 20 20 0a 20 20 28 64 65 66 69 6e  s).    .  (defin
02c0: 65 20 28 6e 6f 64 65 73 65 74 3f 20 78 29 0a 20  e (nodeset? x). 
02d0: 20 20 20 28 6f 72 20 28 61 6e 64 20 28 70 61 69     (or (and (pai
02e0: 72 3f 20 78 29 20 28 6e 6f 74 20 28 73 79 6d 62  r? x) (not (symb
02f0: 6f 6c 3f 20 28 63 61 72 20 78 29 29 29 29 20 28  ol? (car x)))) (
0300: 6e 75 6c 6c 3f 20 78 29 29 29 0a 20 20 0a 20 20  null? x))).  .  
0310: 28 64 65 66 69 6e 65 20 28 78 6d 6c 2d 65 6c 65  (define (xml-ele
0320: 6d 65 6e 74 2d 74 61 67 20 73 29 0a 20 20 20 20  ment-tag s).    
0330: 28 69 66 20 28 61 6e 64 20 28 70 61 69 72 3f 20  (if (and (pair? 
0340: 73 29 20 28 73 79 6d 62 6f 6c 3f 20 28 63 61 72  s) (symbol? (car
0350: 20 73 29 29 29 0a 20 20 20 20 20 20 20 20 28 63   s))).        (c
0360: 61 72 20 73 29 0a 20 20 20 20 20 20 20 20 28 65  ar s).        (e
0370: 72 72 6f 72 20 27 78 6d 6c 2d 65 6c 65 6d 65 6e  rror 'xml-elemen
0380: 74 2d 74 61 67 20 22 65 78 70 65 63 74 65 64 20  t-tag "expected 
0390: 61 6e 20 78 6d 6c 2d 65 6c 65 6d 65 6e 74 2c 20  an xml-element, 
03a0: 67 69 76 65 6e 22 20 73 29 29 29 0a 20 20 0a 20  given" s))).  . 
03b0: 20 28 64 65 66 69 6e 65 20 28 78 6d 6c 2d 65 6c   (define (xml-el
03c0: 65 6d 65 6e 74 2d 61 74 74 72 69 62 75 74 65 73  ement-attributes
03d0: 20 73 29 0a 20 20 20 20 28 69 66 20 28 61 6e 64   s).    (if (and
03e0: 20 28 70 61 69 72 3f 20 73 29 20 28 73 79 6d 62   (pair? s) (symb
03f0: 6f 6c 3f 20 28 63 61 72 20 73 29 29 29 0a 20 20  ol? (car s))).  
0400: 20 20 20 20 20 20 28 66 6f 6c 64 2d 72 69 67 68        (fold-righ
0410: 74 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 0a  t (lambda (a b).
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 20 20 20 20 28 69 66 20 28 61 6e 64 20 28        (if (and (
0440: 70 61 69 72 3f 20 61 29 20 28 65 71 3f 20 27 40  pair? a) (eq? '@
0450: 20 28 63 61 72 20 61 29 29 29 0a 20 20 20 20 20   (car a))).     
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0470: 20 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20       (if (null? 
0480: 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 28 66 69 6c 74 65 72 20 28 6c 61 6d 62 64 61   (filter (lambda
04b0: 20 28 69 29 20 28 6e 6f 74 20 28 61 6e 64 20 28   (i) (not (and (
04c0: 70 61 69 72 3f 20 69 29 20 28 65 71 3f 20 27 40  pair? i) (eq? '@
04d0: 20 28 63 61 72 20 69 29 29 29 29 29 20 28 63 64   (car i))))) (cd
04e0: 72 20 61 29 29 0a 20 20 20 20 20 20 20 20 20 20  r a)).          
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0500: 20 20 20 20 28 66 6f 6c 64 2d 72 69 67 68 74 20      (fold-right 
0510: 28 6c 61 6d 62 64 61 20 28 63 20 64 29 0a 20 20  (lambda (c d).  
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 61            (if (a
0550: 6e 64 20 28 70 61 69 72 3f 20 63 29 20 28 65 71  nd (pair? c) (eq
0560: 3f 20 27 40 20 28 63 61 72 20 63 29 29 29 0a 20  ? '@ (car c))). 
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
05a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 20 28 63 6f 6e 73 20 63 20 64 29 29 29 0a 20 20   (cons c d))).  
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 20 20 20 62 20 28 63 64 72 20 61          b (cdr a
0610: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 29                b)
0630: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0640: 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20        '().      
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
0660: 64 72 20 73 29 29 0a 20 20 20 20 20 20 20 20 28  dr s)).        (
0670: 65 72 72 6f 72 20 27 78 6d 6c 2d 65 6c 65 6d 65  error 'xml-eleme
0680: 6e 74 2d 61 74 74 72 69 62 75 74 65 73 20 22 65  nt-attributes "e
0690: 78 70 65 63 74 65 64 20 61 6e 20 78 6d 6c 2d 65  xpected an xml-e
06a0: 6c 65 6d 65 6e 74 2c 20 67 69 76 65 6e 22 20 73  lement, given" s
06b0: 29 29 29 0a 20 20 0a 20 20 28 64 65 66 69 6e 65  ))).  .  (define
06c0: 20 28 78 6d 6c 2d 65 6c 65 6d 65 6e 74 2d 63 6f   (xml-element-co
06d0: 6e 74 65 6e 74 73 20 73 29 0a 20 20 20 20 28 69  ntents s).    (i
06e0: 66 20 28 61 6e 64 20 28 70 61 69 72 3f 20 73 29  f (and (pair? s)
06f0: 20 28 73 79 6d 62 6f 6c 3f 20 28 63 61 72 20 73   (symbol? (car s
0700: 29 29 29 0a 20 20 20 20 20 20 20 20 28 66 69 6c  ))).        (fil
0710: 74 65 72 20 28 6c 61 6d 62 64 61 20 28 69 29 0a  ter (lambda (i).
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 20 28 6e 6f 74 20 28 61 6e 64 20 28 70 61 69    (not (and (pai
0740: 72 3f 20 69 29 20 28 65 71 3f 20 27 40 20 28 63  r? i) (eq? '@ (c
0750: 61 72 20 69 29 29 29 29 29 0a 20 20 20 20 20 20  ar i))))).      
0760: 20 20 20 20 20 20 20 20 20 20 28 63 64 72 20 73            (cdr s
0770: 29 29 0a 20 20 20 20 20 20 20 20 28 65 72 72 6f  )).        (erro
0780: 72 20 27 78 6d 6c 2d 65 6c 65 6d 65 6e 74 2d 63  r 'xml-element-c
0790: 6f 6e 74 65 6e 74 73 20 22 65 78 70 65 63 74 65  ontents "expecte
07a0: 64 20 61 6e 20 78 6d 6c 2d 65 6c 65 6d 65 6e 74  d an xml-element
07b0: 2c 20 67 69 76 65 6e 22 20 73 29 29 29 0a 20 20  , given" s))).  
07c0: 0a 20 20 28 64 65 66 69 6e 65 20 28 6d 61 74 63  .  (define (matc
07d0: 68 2d 78 6d 6c 2d 61 74 74 72 69 62 75 74 65 20  h-xml-attribute 
07e0: 6b 65 79 20 6c 29 0a 20 20 20 20 28 69 66 20 28  key l).    (if (
07f0: 6e 6f 74 20 28 70 61 69 72 3f 20 6c 29 29 0a 20  not (pair? l)). 
0800: 20 20 20 20 20 20 20 23 66 0a 20 20 20 20 20 20         #f.      
0810: 20 20 28 69 66 20 28 65 71 3f 20 28 63 61 72 20    (if (eq? (car 
0820: 28 63 61 72 20 6c 29 29 20 6b 65 79 29 0a 20 20  (car l)) key).  
0830: 20 20 20 20 20 20 20 20 20 20 28 63 61 72 20 6c            (car l
0840: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6d  ).            (m
0850: 61 74 63 68 2d 78 6d 6c 2d 61 74 74 72 69 62 75  atch-xml-attribu
0860: 74 65 20 6b 65 79 20 28 63 64 72 20 6c 29 29 29  te key (cdr l)))
0870: 29 29 0a 20 20 0a 20 20 28 64 65 66 69 6e 65 20  )).  .  (define 
0880: 28 66 69 6c 74 65 72 2d 61 74 74 72 69 62 75 74  (filter-attribut
0890: 65 73 20 6b 65 79 73 20 6c 73 74 29 0a 20 20 20  es keys lst).   
08a0: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6c 73 74 29   (if (null? lst)
08b0: 0a 20 20 20 20 20 20 20 20 27 28 29 0a 20 20 20  .        '().   
08c0: 20 20 20 20 20 28 69 66 20 28 6d 65 6d 62 65 72       (if (member
08d0: 20 28 63 61 61 72 20 6c 73 74 29 20 6b 65 79 73   (caar lst) keys
08e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 66  ).            (f
08f0: 69 6c 74 65 72 2d 61 74 74 72 69 62 75 74 65 73  ilter-attributes
0900: 20 6b 65 79 73 20 28 63 64 72 20 6c 73 74 29 29   keys (cdr lst))
0910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f  .            (co
0920: 6e 73 20 28 63 61 72 20 6c 73 74 29 20 28 66 69  ns (car lst) (fi
0930: 6c 74 65 72 2d 61 74 74 72 69 62 75 74 65 73 20  lter-attributes 
0940: 6b 65 79 73 20 28 63 64 72 20 6c 73 74 29 29 29  keys (cdr lst)))
0950: 29 29 29 0a 20 20 0a 20 20 29 0a 0a 28 6d 6f 64  ))).  .  )..(mod
0960: 75 6c 65 20 69 6e 74 65 72 6e 61 6c 2d 63 6f 6d  ule internal-com
0970: 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 63 6f 6d  pile-clause (com
0980: 70 69 6c 65 2d 63 6c 61 75 73 65 29 0a 20 20 28  pile-clause).  (
0990: 69 6d 70 6f 72 74 20 73 78 6d 6c 2d 61 63 63 65  import sxml-acce
09a0: 73 73 6f 72 73 29 0a 20 20 0a 20 20 28 64 65 66  ssors).  .  (def
09b0: 69 6e 65 2d 73 79 6e 74 61 78 20 63 6f 6d 70 69  ine-syntax compi
09c0: 6c 65 2d 63 6c 61 75 73 65 0a 20 20 20 20 28 6c  le-clause.    (l
09d0: 61 6d 62 64 61 20 28 73 74 78 29 0a 20 20 20 20  ambda (stx).    
09e0: 20 20 28 6c 65 74 72 65 63 0a 20 20 20 20 20 20    (letrec.      
09f0: 20 20 20 20 28 5b 73 78 6d 6c 2d 6d 61 74 63 68      ([sxml-match
0a00: 2d 73 79 6e 74 61 78 2d 65 72 72 6f 72 0a 20 20  -syntax-error.  
0a10: 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64            (lambd
0a20: 61 20 28 6d 73 67 20 65 78 70 20 73 75 62 29 0a  a (msg exp sub).
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
0a40: 79 6e 74 61 78 2d 65 72 72 6f 72 20 73 75 62 20  yntax-error sub 
0a50: 6d 73 67 29 29 5d 0a 20 20 20 20 20 20 20 20 20  msg))].         
0a60: 20 20 5b 65 6c 6c 69 70 73 69 73 3f 0a 20 20 20    [ellipsis?.   
0a70: 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61           (lambda
0a80: 20 28 73 74 78 29 0a 20 20 20 20 20 20 20 20 20   (stx).         
0a90: 20 20 20 20 20 28 61 6e 64 20 28 69 64 65 6e 74       (and (ident
0aa0: 69 66 69 65 72 3f 20 73 74 78 29 20 28 65 71 3f  ifier? stx) (eq?
0ab0: 20 27 2e 2e 2e 20 28 73 79 6e 74 61 78 2d 6f 62   '... (syntax-ob
0ac0: 6a 65 63 74 2d 3e 64 61 74 75 6d 20 73 74 78 29  ject->datum stx)
0ad0: 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  )))].           
0ae0: 5b 6c 69 74 65 72 61 6c 3f 0a 20 20 20 20 20 20  [literal?.      
0af0: 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73        (lambda (s
0b00: 74 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  tx).            
0b10: 20 20 28 6c 65 74 20 28 5b 78 20 28 73 79 6e 74    (let ([x (synt
0b20: 61 78 2d 6f 62 6a 65 63 74 2d 3e 64 61 74 75 6d  ax-object->datum
0b30: 20 73 74 78 29 5d 29 0a 20 20 20 20 20 20 20 20   stx)]).        
0b40: 20 20 20 20 20 20 20 20 28 6f 72 20 28 73 74 72          (or (str
0b50: 69 6e 67 3f 20 78 29 0a 20 20 20 20 20 20 20 20  ing? x).        
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
0b70: 72 3f 20 78 29 0a 20 20 20 20 20 20 20 20 20 20  r? x).          
0b80: 20 20 20 20 20 20 20 20 20 20 28 6e 75 6d 62 65            (numbe
0b90: 72 3f 20 78 29 0a 20 20 20 20 20 20 20 20 20 20  r? x).          
0ba0: 20 20 20 20 20 20 20 20 20 20 28 62 6f 6f 6c 65            (boole
0bb0: 61 6e 3f 20 78 29 29 29 29 5d 0a 20 20 20 20 20  an? x))))].     
0bc0: 20 20 20 20 20 20 5b 6b 65 79 77 6f 72 64 3f 0a        [keyword?.
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d              (lam
0be0: 62 64 61 20 28 73 74 78 29 0a 20 20 20 20 20 20  bda (stx).      
0bf0: 20 20 20 20 20 20 20 20 28 61 6e 64 20 28 69 64          (and (id
0c00: 65 6e 74 69 66 69 65 72 3f 20 73 74 78 29 0a 20  entifier? stx). 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 28 6c 65 74 20 28 5b 73 74 72 20 28 73 79    (let ([str (sy
0c30: 6d 62 6f 6c 2d 3e 73 74 72 69 6e 67 20 28 73 79  mbol->string (sy
0c40: 6e 74 61 78 2d 6f 62 6a 65 63 74 2d 3e 64 61 74  ntax-object->dat
0c50: 75 6d 20 73 74 78 29 29 5d 29 0a 20 20 20 20 20  um stx))]).     
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 28 63 68 61 72 3d 3f 20 23 5c 3a 20 28 73 74 72  (char=? #\: (str
0c80: 69 6e 67 2d 72 65 66 20 73 74 72 20 28 2d 20 28  ing-ref str (- (
0c90: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 73 74  string-length st
0ca0: 72 29 20 31 29 29 29 29 29 29 5d 0a 20 20 20 20  r) 1))))))].    
0cb0: 20 20 20 20 20 20 20 5b 65 78 74 72 61 63 74 2d         [extract-
0cc0: 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20 20 20  cata-fun.       
0cd0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 66       (lambda (cf
0ce0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0cf0: 28 73 79 6e 74 61 78 2d 63 61 73 65 20 63 66 20  (syntax-case cf 
0d00: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
0d10: 20 20 20 5b 23 66 20 23 66 5d 0a 20 20 20 20 20     [#f #f].     
0d20: 20 20 20 20 20 20 20 20 20 20 20 5b 6f 74 68 65             [othe
0d30: 72 20 63 66 5d 29 29 5d 0a 20 20 20 20 20 20 20  r cf]))].       
0d40: 20 20 20 20 5b 61 64 64 2d 70 61 74 2d 76 61 72      [add-pat-var
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61  .            (la
0d60: 6d 62 64 61 20 28 70 76 61 72 20 70 76 61 72 2d  mbda (pvar pvar-
0d70: 6c 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  lst).           
0d80: 20 20 20 28 64 65 66 69 6e 65 20 28 63 68 65 63     (define (chec
0d90: 6b 2d 70 76 61 72 20 6c 73 74 29 0a 20 20 20 20  k-pvar lst).    
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20              (if 
0db0: 28 6e 75 6c 6c 3f 20 6c 73 74 29 0a 20 20 20 20  (null? lst).    
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 28 76 6f 69 64 29 0a 20 20 20 20 20 20 20 20 20  (void).         
0de0: 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28             (if (
0df0: 62 6f 75 6e 64 2d 69 64 65 6e 74 69 66 69 65 72  bound-identifier
0e00: 3d 3f 20 28 63 61 72 20 6c 73 74 29 20 70 76 61  =? (car lst) pva
0e10: 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r).             
0e20: 20 20 20 20 20 20 20 20 20 20 20 28 73 78 6d 6c             (sxml
0e30: 2d 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d 65 72  -match-syntax-er
0e40: 72 6f 72 20 22 64 75 70 6c 69 63 61 74 65 20 70  ror "duplicate p
0e50: 61 74 74 65 72 6e 20 76 61 72 69 61 62 6c 65 20  attern variable 
0e60: 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20  not allowed".   
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0ea0: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 70 76 61 72 29 0a 20 20 20 20 20 20 20     pvar).       
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 28 63 68 65 63 6b 2d 70 76 61 72 20 28 63 64   (check-pvar (cd
0f00: 72 20 6c 73 74 29 29 29 29 29 0a 20 20 20 20 20  r lst))))).     
0f10: 20 20 20 20 20 20 20 20 20 28 63 68 65 63 6b 2d           (check-
0f20: 70 76 61 72 20 70 76 61 72 2d 6c 73 74 29 0a 20  pvar pvar-lst). 
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
0f40: 6e 73 20 70 76 61 72 20 70 76 61 72 2d 6c 73 74  ns pvar pvar-lst
0f50: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 5b  ))].           [
0f60: 61 64 64 2d 63 61 74 61 2d 64 65 66 0a 20 20 20  add-cata-def.   
0f70: 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61           (lambda
0f80: 20 28 64 65 70 74 68 20 63 76 61 72 73 20 63 66   (depth cvars cf
0f90: 75 6e 20 63 74 65 6d 70 20 63 64 65 66 73 29 0a  un ctemp cdefs).
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
0fb0: 6f 6e 73 20 28 6c 69 73 74 20 64 65 70 74 68 20  ons (list depth 
0fc0: 63 76 61 72 73 20 63 66 75 6e 20 63 74 65 6d 70  cvars cfun ctemp
0fd0: 29 20 63 64 65 66 73 29 29 5d 0a 20 20 20 20 20  ) cdefs))].     
0fe0: 20 20 20 20 20 20 5b 70 72 6f 63 65 73 73 2d 63        [process-c
0ff0: 61 74 61 2d 65 78 70 0a 20 20 20 20 20 20 20 20  ata-exp.        
1000: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 64 65 70      (lambda (dep
1010: 74 68 20 63 66 75 6e 20 63 74 65 6d 70 29 0a 20  th cfun ctemp). 
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66               (if
1030: 20 28 3d 20 64 65 70 74 68 20 30 29 0a 20 20 20   (= depth 0).   
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1050: 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 63 66  with-syntax ([cf
1060: 20 63 66 75 6e 5d 0a 20 20 20 20 20 20 20 20 20   cfun].         
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 20 20 20 20 20 5b 63 74 20 63 74 65 6d 70         [ct ctemp
1090: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
10a0: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28         (syntax (
10b0: 63 66 20 63 74 29 29 29 0a 20 20 20 20 20 20 20  cf ct))).       
10c0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20             (let 
10d0: 28 5b 6e 65 77 2d 63 74 65 6d 70 20 28 63 61 72  ([new-ctemp (car
10e0: 20 28 67 65 6e 65 72 61 74 65 2d 74 65 6d 70 6f   (generate-tempo
10f0: 72 61 72 69 65 73 20 28 6c 69 73 74 20 63 74 65  raries (list cte
1100: 6d 70 29 29 29 5d 29 0a 20 20 20 20 20 20 20 20  mp)))]).        
1110: 20 20 20 20 20 20 20 20 20 20 20 20 28 77 69 74              (wit
1120: 68 2d 73 79 6e 74 61 78 20 28 5b 63 74 20 63 74  h-syntax ([ct ct
1130: 65 6d 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20  emp].           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 5b 6e 63 74 20 6e 65 77 2d         [nct new-
1160: 63 74 65 6d 70 5d 0a 20 20 20 20 20 20 20 20 20  ctemp].         
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 20 20 20 5b 62 6f 64 79 20 28           [body (
1190: 70 72 6f 63 65 73 73 2d 63 61 74 61 2d 65 78 70  process-cata-exp
11a0: 20 28 2d 20 64 65 70 74 68 20 31 29 20 63 66 75   (- depth 1) cfu
11b0: 6e 20 6e 65 77 2d 63 74 65 6d 70 29 5d 29 0a 20  n new-ctemp)]). 
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 6d 61       (syntax (ma
11e0: 70 20 28 6c 61 6d 62 64 61 20 28 6e 63 74 29 20  p (lambda (nct) 
11f0: 62 6f 64 79 29 20 63 74 29 29 29 29 29 29 5d 0a  body) ct))))))].
1200: 20 20 20 20 20 20 20 20 20 20 20 5b 70 72 6f 63             [proc
1210: 65 73 73 2d 63 61 74 61 2d 64 65 66 73 0a 20 20  ess-cata-defs.  
1220: 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64            (lambd
1230: 61 20 28 63 61 74 61 2d 64 65 66 73 20 62 6f 64  a (cata-defs bod
1240: 79 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y).             
1250: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 63 61 74 61   (if (null? cata
1260: 2d 64 65 66 73 29 0a 20 20 20 20 20 20 20 20 20  -defs).         
1270: 20 20 20 20 20 20 20 20 20 62 6f 64 79 0a 20 20           body.  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 28 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 28  (with-syntax ([(
12a0: 63 61 74 61 2d 62 69 6e 64 69 6e 67 20 2e 2e 2e  cata-binding ...
12b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20     (map (lambda 
12e0: 28 64 65 66 29 0a 20 20 20 20 20 20 20 20 20 20  (def).          
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 77                (w
1310: 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 62 76 61  ith-syntax ([bva
1320: 72 20 28 63 61 64 72 20 64 65 66 29 5d 0a 20 20  r (cadr def)].  
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 5b 62 76 61 6c 20 28 70 72 6f 63 65      [bval (proce
1370: 73 73 2d 63 61 74 61 2d 65 78 70 20 28 63 61 72  ss-cata-exp (car
1380: 20 64 65 66 29 0a 20 20 20 20 20 20 20 20 20 20   def).          
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 28 63 61 64 64 72 20 64 65 66 29 0a      (caddr def).
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1430: 61 64 64 64 72 20 64 65 66 29 29 5d 29 0a 20 20  adddr def))]).  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
1470: 28 62 76 61 72 20 62 76 61 6c 29 29 29 29 0a 20  (bvar bval)))). 
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 63 61 74 61 2d 64 65 66 73 29 5d       cata-defs)]
14b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 5b 62 6f 64 79 2d 73 74 78 20 62 6f 64 79 5d   [body-stx body]
14e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14f0: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c        (syntax (l
1500: 65 74 2d 76 61 6c 75 65 73 20 28 63 61 74 61 2d  et-values (cata-
1510: 62 69 6e 64 69 6e 67 20 2e 2e 2e 29 0a 20 20 20  binding ...).   
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 62 6f 64 79 2d             body-
1540: 73 74 78 29 29 29 29 29 5d 0a 20 20 20 20 20 20  stx)))))].      
1550: 20 20 20 20 20 5b 63 61 74 61 2d 64 65 66 73 2d       [cata-defs-
1560: 3e 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20  >pvar-lst.      
1570: 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6c        (lambda (l
1580: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
1590: 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6c 73 74    (if (null? lst
15a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15b0: 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 20 20      '().        
15c0: 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 69            (let i
15d0: 74 65 72 20 28 5b 69 74 65 6d 73 20 28 63 61 64  ter ([items (cad
15e0: 72 20 28 63 61 72 20 6c 73 74 29 29 5d 29 0a 20  r (car lst))]). 
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 28 73 79 6e 74 61 78 2d 63 61 73 65 20     (syntax-case 
1610: 69 74 65 6d 73 20 28 29 0a 20 20 20 20 20 20 20  items ().       
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1630: 28 29 20 28 63 61 74 61 2d 64 65 66 73 2d 3e 70  () (cata-defs->p
1640: 76 61 72 2d 6c 73 74 20 28 63 64 72 20 6c 73 74  var-lst (cdr lst
1650: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
1660: 20 20 20 20 20 20 20 20 20 20 5b 28 66 73 74 20            [(fst 
1670: 2e 20 72 73 74 29 20 28 63 6f 6e 73 20 28 73 79  . rst) (cons (sy
1680: 6e 74 61 78 20 66 73 74 29 20 28 69 74 65 72 20  ntax fst) (iter 
1690: 28 73 79 6e 74 61 78 20 72 73 74 29 29 29 5d 29  (syntax rst)))])
16a0: 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  )))].           
16b0: 5b 70 72 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d  [process-output-
16c0: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  action.         
16d0: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 63 74 69     (lambda (acti
16e0: 6f 6e 20 64 6f 74 74 65 64 2d 76 61 72 73 29 0a  on dotted-vars).
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64                (d
1700: 65 66 69 6e 65 20 28 66 69 6e 69 74 65 2d 6c 73  efine (finite-ls
1710: 74 3f 20 6c 73 74 29 0a 20 20 20 20 20 20 20 20  t? lst).        
1720: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d          (syntax-
1730: 63 61 73 65 20 6c 73 74 20 28 29 0a 20 20 20 20  case lst ().    
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1750: 74 65 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  tem.            
1760: 20 20 20 20 20 20 20 28 69 64 65 6e 74 69 66 69         (identifi
1770: 65 72 3f 20 28 73 79 6e 74 61 78 20 69 74 65 6d  er? (syntax item
1780: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
1790: 20 20 20 20 20 20 23 66 29 0a 20 20 20 20 20 20        #f).      
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 29 0a              (().
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 23 74 29 0a 20 20 20 20 20 20 20 20 20     #t).         
17d0: 20 20 20 20 20 20 20 20 20 28 28 66 73 74 20 64           ((fst d
17e0: 6f 74 73 20 2e 20 72 73 74 29 0a 20 20 20 20 20  ots . rst).     
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
1800: 6c 6c 69 70 73 69 73 3f 20 28 73 79 6e 74 61 78  llipsis? (syntax
1810: 20 64 6f 74 73 29 29 0a 20 20 20 20 20 20 20 20   dots)).        
1820: 20 20 20 20 20 20 20 20 20 20 20 23 66 29 0a 20             #f). 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 28 28 66 73 74 20 2e 20 72 73 74 29 0a 20 20   ((fst . rst).  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 28 66 69 6e 69 74 65 2d 6c 73 74 3f 20 28 73   (finite-lst? (s
1870: 79 6e 74 61 78 20 72 73 74 29 29 29 29 29 0a 20  yntax rst))))). 
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 65               (de
1890: 66 69 6e 65 20 28 65 78 70 61 6e 64 2d 6c 73 74  fine (expand-lst
18a0: 20 6c 73 74 29 0a 20 20 20 20 20 20 20 20 20 20   lst).          
18b0: 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63 61        (syntax-ca
18c0: 73 65 20 6c 73 74 20 28 29 0a 20 20 20 20 20 20  se lst ().      
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 29 20              [() 
18e0: 28 73 79 6e 74 61 78 20 27 28 29 29 5d 0a 20 20  (syntax '())].  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 5b 69 74 65 6d 0a 20 20 20 20 20 20 20 20 20 20  [item.          
1910: 20 20 20 20 20 20 20 20 20 28 69 64 65 6e 74 69           (identi
1920: 66 69 65 72 3f 20 28 73 79 6e 74 61 78 20 69 74  fier? (syntax it
1930: 65 6d 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  em)).           
1940: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
1950: 69 74 65 6d 29 5d 0a 20 20 20 20 20 20 20 20 20  item)].         
1960: 20 20 20 20 20 20 20 20 20 5b 28 66 73 74 20 64           [(fst d
1970: 6f 74 73 20 2e 20 72 73 74 29 0a 20 20 20 20 20  ots . rst).     
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
1990: 6c 6c 69 70 73 69 73 3f 20 28 73 79 6e 74 61 78  llipsis? (syntax
19a0: 20 64 6f 74 73 29 29 0a 20 20 20 20 20 20 20 20   dots)).        
19b0: 20 20 20 20 20 20 20 20 20 20 20 28 77 69 74 68             (with
19c0: 2d 73 79 6e 74 61 78 20 28 5b 65 78 70 2d 6c 66  -syntax ([exp-lf
19d0: 74 20 28 65 78 70 61 6e 64 2d 64 6f 74 74 65 64  t (expand-dotted
19e0: 2d 69 74 65 6d 0a 20 20 20 20 20 20 20 20 20 20  -item.          
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 28 70 72 6f 63 65 73 73 2d 6f 75 74 70 75 74   (process-output
1a20: 2d 61 63 74 69 6f 6e 20 28 73 79 6e 74 61 78 20  -action (syntax 
1a30: 66 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  fst).           
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 64 6f 74 74 65 64 2d 76 61         dotted-va
1a80: 72 73 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  rs))].          
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 5b 65 78 70 2d 72 67 74 20         [exp-rgt 
1ab0: 28 65 78 70 61 6e 64 2d 6c 73 74 20 28 73 79 6e  (expand-lst (syn
1ac0: 74 61 78 20 72 73 74 29 29 5d 29 0a 20 20 20 20  tax rst))]).    
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 28 73 79 6e 74 61 78 20 28 61 70 70 65 6e 64   (syntax (append
1af0: 20 65 78 70 2d 6c 66 74 20 65 78 70 2d 72 67 74   exp-lft exp-rgt
1b00: 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  )))].           
1b10: 20 20 20 20 20 20 20 5b 28 66 73 74 20 2e 20 72         [(fst . r
1b20: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
1b30: 20 20 20 20 20 20 20 28 77 69 74 68 2d 73 79 6e         (with-syn
1b40: 74 61 78 20 28 5b 65 78 70 2d 6c 66 74 20 28 70  tax ([exp-lft (p
1b50: 72 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d 61 63  rocess-output-ac
1b60: 74 69 6f 6e 20 28 73 79 6e 74 61 78 20 66 73 74  tion (syntax fst
1b70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d     dotted-vars)]
1bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 5b 65 78 70 2d 72 67 74 20 28 65 78 70 61    [exp-rgt (expa
1bf0: 6e 64 2d 6c 73 74 20 28 73 79 6e 74 61 78 20 72  nd-lst (syntax r
1c00: 73 74 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20  st))]).         
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
1c20: 74 61 78 20 28 63 6f 6e 73 20 65 78 70 2d 6c 66  tax (cons exp-lf
1c30: 74 20 65 78 70 2d 72 67 74 29 29 29 5d 29 29 0a  t exp-rgt)))])).
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64                (d
1c50: 65 66 69 6e 65 20 28 6d 65 6d 62 65 72 2d 76 61  efine (member-va
1c60: 72 3f 20 76 61 72 20 6c 73 74 29 0a 20 20 20 20  r? var lst).    
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74              (let
1c80: 20 69 74 65 72 20 28 5b 6c 73 74 20 6c 73 74 5d   iter ([lst lst]
1c90: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1ca0: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6c      (if (null? l
1cb0: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
1cc0: 20 20 20 20 20 20 20 20 20 20 23 66 0a 20 20 20            #f.   
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 28 69 66 20 28 6f 72 20 28 62 6f 75 6e     (if (or (boun
1cf0: 64 2d 69 64 65 6e 74 69 66 69 65 72 3d 3f 20 76  d-identifier=? v
1d00: 61 72 20 28 63 61 72 20 6c 73 74 29 29 0a 20 20  ar (car lst)).  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 72 65              (fre
1d30: 65 2d 69 64 65 6e 74 69 66 69 65 72 3d 3f 20 76  e-identifier=? v
1d40: 61 72 20 28 63 61 72 20 6c 73 74 29 29 29 0a 20  ar (car lst))). 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 23 74 0a 20 20 20 20           #t.    
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 28 69 74 65 72 20 28 63 64 72        (iter (cdr
1d90: 20 6c 73 74 29 29 29 29 29 29 0a 20 20 20 20 20   lst)))))).     
1da0: 20 20 20 20 20 20 20 20 20 28 64 65 66 69 6e 65           (define
1db0: 20 28 64 6f 74 74 65 64 2d 76 61 72 3f 20 76 61   (dotted-var? va
1dc0: 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r).             
1dd0: 20 20 20 28 6d 65 6d 62 65 72 2d 76 61 72 3f 20     (member-var? 
1de0: 76 61 72 20 64 6f 74 74 65 64 2d 76 61 72 73 29  var dotted-vars)
1df0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1e00: 28 64 65 66 69 6e 65 20 28 6d 65 72 67 65 2d 70  (define (merge-p
1e10: 76 61 72 73 20 6c 73 74 31 20 6c 73 74 32 29 0a  vars lst1 lst2).
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 28 69 66 20 28 6e 75 6c 6c 3f 20 6c 73 74 31 29  (if (null? lst1)
1e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e50: 20 20 20 20 20 6c 73 74 32 0a 20 20 20 20 20 20       lst2.      
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1e70: 66 20 28 6d 65 6d 62 65 72 2d 76 61 72 3f 20 28  f (member-var? (
1e80: 63 61 72 20 6c 73 74 31 29 20 6c 73 74 32 29 0a  car lst1) lst2).
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 20 20 28 6d 65 72 67 65 2d 70          (merge-p
1eb0: 76 61 72 73 20 28 63 64 72 20 6c 73 74 31 29 20  vars (cdr lst1) 
1ec0: 6c 73 74 32 29 0a 20 20 20 20 20 20 20 20 20 20  lst2).          
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1ee0: 6f 6e 73 20 28 63 61 72 20 6c 73 74 31 29 20 28  ons (car lst1) (
1ef0: 6d 65 72 67 65 2d 70 76 61 72 73 20 28 63 64 72  merge-pvars (cdr
1f00: 20 6c 73 74 31 29 20 6c 73 74 32 29 29 29 29 29   lst1) lst2)))))
1f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
1f20: 64 65 66 69 6e 65 20 28 73 65 6c 65 63 74 2d 64  define (select-d
1f30: 6f 74 74 65 64 2d 76 61 72 73 20 78 29 0a 20 20  otted-vars x).  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64                (d
1f50: 65 66 69 6e 65 20 28 77 61 6c 6b 2d 71 75 61 73  efine (walk-quas
1f60: 69 2d 62 6f 64 79 20 79 29 0a 20 20 20 20 20 20  i-body y).      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
1f80: 74 61 78 2d 63 61 73 65 20 79 20 28 75 6e 71 75  tax-case y (unqu
1f90: 6f 74 65 20 75 6e 71 75 6f 74 65 2d 73 70 6c 69  ote unquote-spli
1fa0: 63 69 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20  cing).          
1fb0: 20 20 20 20 20 20 20 20 20 20 5b 28 28 75 6e 71            [((unq
1fc0: 75 6f 74 65 20 61 29 20 2e 20 72 73 74 29 0a 20  uote a) . rst). 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 28 6d 65 72 67 65 2d 70 76 61 72 73      (merge-pvars
1ff0: 20 28 73 65 6c 65 63 74 2d 64 6f 74 74 65 64 2d   (select-dotted-
2000: 76 61 72 73 20 28 73 79 6e 74 61 78 20 61 29 29  vars (syntax a))
2010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 28 77 61 6c 6b 2d 71 75 61 73 69 2d 62     (walk-quasi-b
2040: 6f 64 79 20 28 73 79 6e 74 61 78 20 72 73 74 29  ody (syntax rst)
2050: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
2060: 20 20 20 20 20 20 20 20 5b 28 28 75 6e 71 75 6f          [((unquo
2070: 74 65 2d 73 70 6c 69 63 69 6e 67 20 61 29 20 2e  te-splicing a) .
2080: 20 72 73 74 29 0a 20 20 20 20 20 20 20 20 20 20   rst).          
2090: 20 20 20 20 20 20 20 20 20 20 20 28 6d 65 72 67             (merg
20a0: 65 2d 70 76 61 72 73 20 28 73 65 6c 65 63 74 2d  e-pvars (select-
20b0: 64 6f 74 74 65 64 2d 76 61 72 73 20 28 73 79 6e  dotted-vars (syn
20c0: 74 61 78 20 61 29 29 0a 20 20 20 20 20 20 20 20  tax a)).        
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 20 20 20 20 20 28 77 61 6c 6b 2d            (walk-
20f0: 71 75 61 73 69 2d 62 6f 64 79 20 28 73 79 6e 74  quasi-body (synt
2100: 61 78 20 72 73 74 29 29 29 5d 0a 20 20 20 20 20  ax rst)))].     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2120: 28 66 73 74 20 2e 20 72 73 74 29 0a 20 20 20 20  (fst . rst).    
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 28 6d 65 72 67 65 2d 70 76 61 72 73 20 28 77   (merge-pvars (w
2150: 61 6c 6b 2d 71 75 61 73 69 2d 62 6f 64 79 20 28  alk-quasi-body (
2160: 73 79 6e 74 61 78 20 66 73 74 29 29 0a 20 20 20  syntax fst)).   
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2190: 77 61 6c 6b 2d 71 75 61 73 69 2d 62 6f 64 79 20  walk-quasi-body 
21a0: 28 73 79 6e 74 61 78 20 72 73 74 29 29 29 5d 0a  (syntax rst)))].
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 5b 6f 74 68 65 72 0a 20 20 20 20 20      [other.     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 27 28 29 5d 29 29 0a 20 20 20 20 20 20 20 20 20  '()])).         
21f0: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63         (syntax-c
2200: 61 73 65 20 78 20 28 71 75 6f 74 65 20 71 75 61  ase x (quote qua
2210: 73 69 71 75 6f 74 65 29 0a 20 20 20 20 20 20 20  siquote).       
2220: 20 20 20 20 20 20 20 20 20 20 20 5b 28 71 75 6f             [(quo
2230: 74 65 20 2e 20 72 73 74 29 20 27 28 29 5d 0a 20  te . rst) '()]. 
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 5b 28 71 75 61 73 69 71 75 6f 74 65 20 2e 20   [(quasiquote . 
2260: 72 73 74 29 20 28 77 61 6c 6b 2d 71 75 61 73 69  rst) (walk-quasi
2270: 2d 62 6f 64 79 20 28 73 79 6e 74 61 78 20 72 73  -body (syntax rs
2280: 74 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  t))].           
2290: 20 20 20 20 20 20 20 5b 28 66 73 74 20 2e 20 72         [(fst . r
22a0: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
22b0: 20 20 20 20 20 20 20 28 6d 65 72 67 65 2d 70 76         (merge-pv
22c0: 61 72 73 20 28 73 65 6c 65 63 74 2d 64 6f 74 74  ars (select-dott
22d0: 65 64 2d 76 61 72 73 20 28 73 79 6e 74 61 78 20  ed-vars (syntax 
22e0: 66 73 74 29 29 0a 20 20 20 20 20 20 20 20 20 20  fst)).          
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 28 73 65 6c 65 63 74 2d 64 6f        (select-do
2310: 74 74 65 64 2d 76 61 72 73 20 28 73 79 6e 74 61  tted-vars (synta
2320: 78 20 72 73 74 29 29 29 5d 0a 20 20 20 20 20 20  x rst)))].      
2330: 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 74 65              [ite
2340: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
2350: 20 20 20 20 20 28 61 6e 64 20 28 69 64 65 6e 74       (and (ident
2360: 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78 20 69  ifier? (syntax i
2370: 74 65 6d 29 29 0a 20 20 20 20 20 20 20 20 20 20  tem)).          
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64                (d
2390: 6f 74 74 65 64 2d 76 61 72 3f 20 28 73 79 6e 74  otted-var? (synt
23a0: 61 78 20 69 74 65 6d 29 29 29 0a 20 20 20 20 20  ax item))).     
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
23c0: 69 73 74 20 28 73 79 6e 74 61 78 20 69 74 65 6d  ist (syntax item
23d0: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
23e0: 20 20 20 20 20 20 5b 69 74 65 6d 20 27 28 29 5d        [item '()]
23f0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
2400: 20 28 64 65 66 69 6e 65 20 28 65 78 70 61 6e 64   (define (expand
2410: 2d 64 6f 74 74 65 64 2d 69 74 65 6d 20 69 74 65  -dotted-item ite
2420: 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m).             
2430: 20 20 20 28 6c 65 74 20 28 5b 64 76 61 72 73 20     (let ([dvars 
2440: 28 73 65 6c 65 63 74 2d 64 6f 74 74 65 64 2d 76  (select-dotted-v
2450: 61 72 73 20 69 74 65 6d 29 5d 29 0a 20 20 20 20  ars item)]).    
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2470: 79 6e 74 61 78 2d 63 61 73 65 20 69 74 65 6d 20  yntax-case item 
2480: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
2490: 20 20 20 20 20 20 20 5b 78 0a 20 20 20 20 20 20         [x.      
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
24b0: 69 64 65 6e 74 69 66 69 65 72 3f 20 28 73 79 6e  identifier? (syn
24c0: 74 61 78 20 78 29 29 0a 20 20 20 20 20 20 20 20  tax x)).        
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79               (sy
24e0: 6e 74 61 78 20 78 29 5d 0a 20 20 20 20 20 20 20  ntax x)].       
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 78 20               [x 
2500: 28 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 28  (with-syntax ([(
2510: 64 76 20 2e 2e 2e 29 20 64 76 61 72 73 5d 29 0a  dv ...) dvars]).
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
2540: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 64   (map (lambda (d
2550: 76 20 2e 2e 2e 29 20 78 29 20 64 76 20 2e 2e 2e  v ...) x) dv ...
2560: 29 29 29 5d 29 29 29 0a 20 20 20 20 20 20 20 20  )))]))).        
2570: 20 20 20 20 20 20 28 64 65 66 69 6e 65 20 28 65        (define (e
2580: 78 70 61 6e 64 2d 71 75 61 73 69 71 75 6f 74 65  xpand-quasiquote
2590: 2d 62 6f 64 79 20 78 29 0a 20 20 20 20 20 20 20  -body x).       
25a0: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
25b0: 2d 63 61 73 65 20 78 20 28 75 6e 71 75 6f 74 65  -case x (unquote
25c0: 20 75 6e 71 75 6f 74 65 2d 73 70 6c 69 63 69 6e   unquote-splicin
25d0: 67 20 71 75 61 73 69 71 75 6f 74 65 29 0a 20 20  g quasiquote).  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 5b 28 71 75 61 73 69 71 75 6f 74 65 20 2e 20 72  [(quasiquote . r
2600: 73 74 29 20 28 70 72 6f 63 65 73 73 2d 71 75 61  st) (process-qua
2610: 73 69 71 75 6f 74 65 20 78 29 5d 0a 20 20 20 20  siquote x)].    
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 28                [(
2630: 75 6e 71 75 6f 74 65 20 69 74 65 6d 29 0a 20 20  unquote item).  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b   (with-syntax ([
2660: 65 78 70 61 6e 64 65 64 2d 69 74 65 6d 20 28 70  expanded-item (p
2670: 72 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d 61 63  rocess-output-ac
2680: 74 69 6f 6e 20 28 73 79 6e 74 61 78 20 69 74 65  tion (syntax ite
2690: 6d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m).             
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 64 6f 74 74 65 64            dotted
26e0: 2d 76 61 72 73 29 5d 29 0a 20 20 20 20 20 20 20  -vars)]).       
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2700: 79 6e 74 61 78 20 28 75 6e 71 75 6f 74 65 20 65  yntax (unquote e
2710: 78 70 61 6e 64 65 64 2d 69 74 65 6d 29 29 29 5d  xpanded-item)))]
2720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2730: 20 20 20 5b 28 75 6e 71 75 6f 74 65 2d 73 70 6c     [(unquote-spl
2740: 69 63 69 6e 67 20 69 74 65 6d 29 0a 20 20 20 20  icing item).    
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2760: 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 65 78  with-syntax ([ex
2770: 70 61 6e 64 65 64 2d 69 74 65 6d 20 28 70 72 6f  panded-item (pro
2780: 63 65 73 73 2d 6f 75 74 70 75 74 2d 61 63 74 69  cess-output-acti
2790: 6f 6e 20 28 73 79 6e 74 61 78 20 69 74 65 6d 29  on (syntax item)
27a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 20 64 6f 74 74 65 64 2d 76          dotted-v
27f0: 61 72 73 29 5d 29 0a 20 20 20 20 20 20 20 20 20  ars)]).         
2800: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
2810: 74 61 78 20 28 75 6e 71 75 6f 74 65 2d 73 70 6c  tax (unquote-spl
2820: 69 63 69 6e 67 20 65 78 70 61 6e 64 65 64 2d 69  icing expanded-i
2830: 74 65 6d 29 29 29 5d 0a 20 20 20 20 20 20 20 20  tem)))].        
2840: 20 20 20 20 20 20 20 20 20 20 5b 28 28 75 6e 71            [((unq
2850: 75 6f 74 65 20 69 74 65 6d 29 20 64 6f 74 73 20  uote item) dots 
2860: 2e 20 72 73 74 29 0a 20 20 20 20 20 20 20 20 20  . rst).         
2870: 20 20 20 20 20 20 20 20 20 20 28 65 6c 6c 69 70            (ellip
2880: 73 69 73 3f 20 28 73 79 6e 74 61 78 20 64 6f 74  sis? (syntax dot
2890: 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s)).            
28a0: 20 20 20 20 20 20 20 28 77 69 74 68 2d 73 79 6e         (with-syn
28b0: 74 61 78 20 28 5b 65 78 70 61 6e 64 65 64 2d 69  tax ([expanded-i
28c0: 74 65 6d 20 28 65 78 70 61 6e 64 2d 64 6f 74 74  tem (expand-dott
28d0: 65 64 2d 69 74 65 6d 20 0a 20 20 20 20 20 20 20  ed-item .       
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 28 70 72 6f 63 65            (proce
2910: 73 73 2d 6f 75 74 70 75 74 2d 61 63 74 69 6f 6e  ss-output-action
2920: 20 28 73 79 6e 74 61 78 20 69 74 65 6d 29 0a 20   (syntax item). 
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 64 6f 74 74 65 64 2d 76 61         dotted-va
2980: 72 73 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  rs))].          
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 5b 65 78 70 61 6e 64 65 64         [expanded
29b0: 2d 72 73 74 20 28 65 78 70 61 6e 64 2d 71 75 61  -rst (expand-qua
29c0: 73 69 71 75 6f 74 65 2d 62 6f 64 79 20 28 73 79  siquote-body (sy
29d0: 6e 74 61 78 20 72 73 74 29 29 5d 29 0a 20 20 20  ntax rst))]).   
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 28 73 79 6e 74 61 78 20 28 28 75 6e 71 75    (syntax ((unqu
2a00: 6f 74 65 2d 73 70 6c 69 63 69 6e 67 20 65 78 70  ote-splicing exp
2a10: 61 6e 64 65 64 2d 69 74 65 6d 29 20 2e 20 65 78  anded-item) . ex
2a20: 70 61 6e 64 65 64 2d 72 73 74 29 29 29 5d 0a 20  panded-rst)))]. 
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 5b 28 69 74 65 6d 20 64 6f 74 73 20 2e 20 72   [(item dots . r
2a50: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
2a60: 20 20 20 20 20 20 20 28 65 6c 6c 69 70 73 69 73         (ellipsis
2a70: 3f 20 28 73 79 6e 74 61 78 20 64 6f 74 73 29 29  ? (syntax dots))
2a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a90: 20 20 20 20 28 77 69 74 68 2d 73 79 6e 74 61 78      (with-syntax
2aa0: 20 28 5b 65 78 70 61 6e 64 65 64 2d 69 74 65 6d   ([expanded-item
2ab0: 20 28 65 78 70 61 6e 64 2d 64 6f 74 74 65 64 2d   (expand-dotted-
2ac0: 69 74 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  item .          
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 28 70 72 6f 63 65 73 73 2d         (process-
2b00: 6f 75 74 70 75 74 2d 61 63 74 69 6f 6e 20 28 73  output-action (s
2b10: 79 6e 74 61 78 20 28 71 75 61 73 69 71 75 6f 74  yntax (quasiquot
2b20: 65 20 69 74 65 6d 29 29 0a 20 20 20 20 20 20 20  e item)).       
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 29 5d 0a   dotted-vars))].
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 5b 65 78 70 61 6e 64 65 64 2d 72 73 74 20 28   [expanded-rst (
2bb0: 65 78 70 61 6e 64 2d 71 75 61 73 69 71 75 6f 74  expand-quasiquot
2bc0: 65 2d 62 6f 64 79 20 28 73 79 6e 74 61 78 20 72  e-body (syntax r
2bd0: 73 74 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20  st))]).         
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
2bf0: 74 61 78 20 28 28 75 6e 71 75 6f 74 65 2d 73 70  tax ((unquote-sp
2c00: 6c 69 63 69 6e 67 20 65 78 70 61 6e 64 65 64 2d  licing expanded-
2c10: 69 74 65 6d 29 20 2e 20 65 78 70 61 6e 64 65 64  item) . expanded
2c20: 2d 72 73 74 29 29 29 5d 0a 20 20 20 20 20 20 20  -rst)))].       
2c30: 20 20 20 20 20 20 20 20 20 20 20 5b 28 66 73 74             [(fst
2c40: 20 2e 20 72 73 74 29 0a 20 20 20 20 20 20 20 20   . rst).        
2c50: 20 20 20 20 20 20 20 20 20 20 20 28 77 69 74 68             (with
2c60: 2d 73 79 6e 74 61 78 20 28 5b 65 78 70 61 6e 64  -syntax ([expand
2c70: 65 64 2d 66 73 74 20 28 65 78 70 61 6e 64 2d 71  ed-fst (expand-q
2c80: 75 61 73 69 71 75 6f 74 65 2d 62 6f 64 79 20 28  uasiquote-body (
2c90: 73 79 6e 74 61 78 20 66 73 74 29 29 5d 0a 20 20  syntax fst))].  
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2cc0: 65 78 70 61 6e 64 65 64 2d 72 73 74 20 28 65 78  expanded-rst (ex
2cd0: 70 61 6e 64 2d 71 75 61 73 69 71 75 6f 74 65 2d  pand-quasiquote-
2ce0: 62 6f 64 79 20 28 73 79 6e 74 61 78 20 72 73 74  body (syntax rst
2cf0: 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  ))]).           
2d00: 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
2d10: 78 20 28 65 78 70 61 6e 64 65 64 2d 66 73 74 20  x (expanded-fst 
2d20: 2e 20 65 78 70 61 6e 64 65 64 2d 72 73 74 29 29  . expanded-rst))
2d30: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )].             
2d40: 20 20 20 20 20 5b 6f 74 68 65 72 20 78 5d 29 29       [other x]))
2d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
2d60: 64 65 66 69 6e 65 20 28 70 72 6f 63 65 73 73 2d  define (process-
2d70: 71 75 61 73 69 71 75 6f 74 65 20 78 29 0a 20 20  quasiquote x).  
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2d90: 79 6e 74 61 78 2d 63 61 73 65 20 78 20 28 29 0a  yntax-case x ().
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 5b 28 71 75 61 73 69 71 75 6f 74 65 20 74    [(quasiquote t
2dc0: 65 72 6d 29 20 28 77 69 74 68 2d 73 79 6e 74 61  erm) (with-synta
2dd0: 78 20 28 5b 65 78 70 61 6e 64 65 64 2d 62 6f 64  x ([expanded-bod
2de0: 79 20 28 65 78 70 61 6e 64 2d 71 75 61 73 69 71  y (expand-quasiq
2df0: 75 6f 74 65 2d 62 6f 64 79 20 28 73 79 6e 74 61  uote-body (synta
2e00: 78 20 74 65 72 6d 29 29 5d 29 0a 20 20 20 20 20  x term))]).     
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 28 73 79 6e 74 61 78 20 28 71 75 61 73 69    (syntax (quasi
2e40: 71 75 6f 74 65 20 65 78 70 61 6e 64 65 64 2d 62  quote expanded-b
2e50: 6f 64 79 29 29 29 5d 0a 20 20 20 20 20 20 20 20  ody)))].        
2e60: 20 20 20 20 20 20 20 20 20 20 5b 65 6c 73 65 20            [else 
2e70: 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 73 79 6e 74  (sxml-match-synt
2e80: 61 78 2d 65 72 72 6f 72 20 22 62 61 64 20 71 75  ax-error "bad qu
2e90: 61 73 69 71 75 6f 74 65 2d 66 6f 72 6d 22 0a 20  asiquote-form". 
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 73 74 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  stx.            
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 78 29 5d 29 29 0a 20 20 20 20 20       x)])).     
2f10: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
2f20: 2d 63 61 73 65 20 61 63 74 69 6f 6e 20 28 71 75  -case action (qu
2f30: 6f 74 65 20 71 75 61 73 69 71 75 6f 74 65 29 0a  ote quasiquote).
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 5b 28 71 75 6f 74 65 20 2e 20 72 73 74 29 20 61  [(quote . rst) a
2f60: 63 74 69 6f 6e 5d 0a 20 20 20 20 20 20 20 20 20  ction].         
2f70: 20 20 20 20 20 20 20 5b 28 71 75 61 73 69 71 75         [(quasiqu
2f80: 6f 74 65 20 2e 20 72 73 74 29 20 28 70 72 6f 63  ote . rst) (proc
2f90: 65 73 73 2d 71 75 61 73 69 71 75 6f 74 65 20 61  ess-quasiquote a
2fa0: 63 74 69 6f 6e 29 5d 0a 20 20 20 20 20 20 20 20  ction)].        
2fb0: 20 20 20 20 20 20 20 20 5b 28 66 73 74 20 2e 20          [(fst . 
2fc0: 72 73 74 29 20 28 69 66 20 28 66 69 6e 69 74 65  rst) (if (finite
2fd0: 2d 6c 73 74 3f 20 61 63 74 69 6f 6e 29 0a 20 20  -lst? action).  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
3000: 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 65 78  with-syntax ([ex
3010: 70 2d 6c 66 74 20 28 70 72 6f 63 65 73 73 2d 6f  p-lft (process-o
3020: 75 74 70 75 74 2d 61 63 74 69 6f 6e 20 28 73 79  utput-action (sy
3030: 6e 74 61 78 20 66 73 74 29 20 64 6f 74 74 65 64  ntax fst) dotted
3040: 2d 76 61 72 73 29 5d 0a 20 20 20 20 20 20 20 20  -vars)].        
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 5b 65 78 70 2d 72 67 74 20         [exp-rgt 
3080: 28 70 72 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d  (process-output-
3090: 61 63 74 69 6f 6e 20 28 73 79 6e 74 61 78 20 72  action (syntax r
30a0: 73 74 29 20 64 6f 74 74 65 64 2d 76 61 72 73 29  st) dotted-vars)
30b0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 65        (syntax (e
30e0: 78 70 2d 6c 66 74 20 2e 20 65 78 70 2d 72 67 74  xp-lft . exp-rgt
30f0: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 28 77 69 74 68 2d 73 79 6e 74 61       (with-synta
3120: 78 20 28 5b 65 78 70 2d 6c 66 74 20 28 70 72 6f  x ([exp-lft (pro
3130: 63 65 73 73 2d 6f 75 74 70 75 74 2d 61 63 74 69  cess-output-acti
3140: 6f 6e 20 28 73 79 6e 74 61 78 20 66 73 74 29 0a  on (syntax fst).
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
31a0: 6f 74 74 65 64 2d 76 61 72 73 29 5d 0a 20 20 20  otted-vars)].   
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
31e0: 2d 72 67 74 20 28 65 78 70 61 6e 64 2d 6c 73 74  -rgt (expand-lst
31f0: 20 28 73 79 6e 74 61 78 20 72 73 74 29 29 5d 29   (syntax rst))])
3200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 20 28 73 79 6e 74 61 78 20 28 61 70 70      (syntax (app
3230: 6c 79 20 65 78 70 2d 6c 66 74 20 65 78 70 2d 72  ly exp-lft exp-r
3240: 67 74 29 29 29 29 5d 0a 20 20 20 20 20 20 20 20  gt))))].        
3250: 20 20 20 20 20 20 20 20 5b 69 74 65 6d 20 61 63          [item ac
3260: 74 69 6f 6e 5d 29 29 5d 0a 20 20 20 20 20 20 20  tion]))].       
3270: 20 20 20 20 5b 63 6f 6d 70 69 6c 65 2d 65 6c 65      [compile-ele
3280: 6d 65 6e 74 2d 70 61 74 0a 20 20 20 20 20 20 20  ment-pat.       
3290: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 65 6c       (lambda (el
32a0: 65 20 65 78 70 20 6e 65 78 74 70 20 66 61 69 6c  e exp nextp fail
32b0: 2d 6b 20 70 76 61 72 2d 6c 73 74 20 64 65 70 74  -k pvar-lst dept
32c0: 68 20 63 61 74 61 2d 66 75 6e 20 63 61 74 61 2d  h cata-fun cata-
32d0: 64 65 66 73 20 64 6f 74 74 65 64 2d 76 61 72 73  defs dotted-vars
32e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
32f0: 28 73 79 6e 74 61 78 2d 63 61 73 65 20 65 6c 65  (syntax-case ele
3300: 20 28 40 29 0a 20 20 20 20 20 20 20 20 20 20 20   (@).           
3310: 20 20 20 20 20 5b 28 74 61 67 20 28 40 20 2e 20       [(tag (@ . 
3320: 61 74 74 72 2d 69 74 65 6d 73 29 20 2e 20 69 74  attr-items) . it
3330: 65 6d 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ems).           
3340: 20 20 20 20 20 20 28 69 64 65 6e 74 69 66 69 65        (identifie
3350: 72 3f 20 28 73 79 6e 74 61 78 20 74 61 67 29 29  r? (syntax tag))
3360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3370: 20 20 28 6c 65 74 20 28 5b 61 74 74 72 2d 65 78    (let ([attr-ex
3380: 70 20 28 63 61 72 20 28 67 65 6e 65 72 61 74 65  p (car (generate
3390: 2d 74 65 6d 70 6f 72 61 72 69 65 73 20 28 6c 69  -temporaries (li
33a0: 73 74 20 65 78 70 29 29 29 5d 0a 20 20 20 20 20  st exp)))].     
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 5b 62 6f 64 79 2d 65 78 70 20 28 63 61 72    [body-exp (car
33d0: 20 28 67 65 6e 65 72 61 74 65 2d 74 65 6d 70 6f   (generate-tempo
33e0: 72 61 72 69 65 73 20 28 6c 69 73 74 20 65 78 70  raries (list exp
33f0: 29 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20  )))]).          
3400: 20 20 20 20 20 20 20 20 20 28 6c 65 74 2d 76 61           (let-va
3410: 6c 75 65 73 20 28 5b 28 74 65 73 74 73 20 6e 65  lues ([(tests ne
3420: 77 2d 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63  w-pvar-lst new-c
3430: 61 74 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74  ata-defs new-dot
3440: 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20  ted-vars).      
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6d 70             (comp
3470: 69 6c 65 2d 61 74 74 72 2d 6c 69 73 74 20 28 73  ile-attr-list (s
3480: 79 6e 74 61 78 20 61 74 74 72 2d 69 74 65 6d 73  yntax attr-items
3490: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 69 74        (syntax it
34d0: 65 6d 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ems).           
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 20 20 20 20 20 20 20 20 61 74 74 72 2d 65 78           attr-ex
3510: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 20 20 62 6f 64 79 2d 65 78 70 0a 20        body-exp. 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 20 20 20 27 28 29 0a 20 20 20 20 20 20 20 20 20     '().         
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 70             nextp
35c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20       fail-k.    
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20 20  pvar-lst.       
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 70               dep
3670: 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  th.             
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 20 20 63 61 74 61 2d 66 75 6e 0a         cata-fun.
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 63 61 74 61 2d 64 65 66 73 0a 20 20      cata-defs.  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29    dotted-vars)])
3730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3740: 20 20 20 20 20 20 28 76 61 6c 75 65 73 20 28 77        (values (w
3750: 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 78 20 65  ith-syntax ([x e
3760: 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp].            
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
3790: 61 78 20 61 74 74 72 2d 65 78 70 5d 0a 20 20 20  ax attr-exp].   
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 20 20 5b 62 78 20 62 6f 64 79          [bx body
37d0: 2d 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20  -exp].          
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 5b 62 6f 64 79 20 74 65 73 74 73 5d 0a 20 20   [body tests].  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 20 20 20 20 20 20 5b 66 61 69 6c 2d 74           [fail-t
3840: 6f 20 66 61 69 6c 2d 6b 5d 29 0a 20 20 20 20 20  o fail-k]).     
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
3870: 78 20 28 69 66 20 28 61 6e 64 20 28 70 61 69 72  x (if (and (pair
3880: 3f 20 78 29 20 28 65 71 3f 20 27 74 61 67 20 28  ? x) (eq? 'tag (
3890: 78 6d 6c 2d 65 6c 65 6d 65 6e 74 2d 74 61 67 20  xml-element-tag 
38a0: 78 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  x))).           
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 28 6c 65 74 20 28 5b 61 78 20 28 78 6d 6c 2d 65  (let ([ax (xml-e
38e0: 6c 65 6d 65 6e 74 2d 61 74 74 72 69 62 75 74 65  lement-attribute
38f0: 73 20 78 29 5d 0a 20 20 20 20 20 20 20 20 20 20  s x)].          
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 20 20 20 5b 62 78 20 28 78 6d 6c 2d         [bx (xml-
3930: 65 6c 65 6d 65 6e 74 2d 63 6f 6e 74 65 6e 74 73  element-contents
3940: 20 78 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20   x)]).          
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 62 6f 64 79 29 0a 20 20 20 20 20 20 20     body).       
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 20 20 20 20 28 66 61 69 6c 2d 74 6f 29 29 29 29      (fail-to))))
39b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
39d0: 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20  w-pvar-lst.     
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39f0: 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74 61          new-cata
3a00: 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20  -defs.          
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61     new-dotted-va
3a30: 72 73 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20  rs)))].         
3a40: 20 20 20 20 20 20 20 5b 28 74 61 67 20 2e 20 69         [(tag . i
3a50: 74 65 6d 73 29 0a 20 20 20 20 20 20 20 20 20 20  tems).          
3a60: 20 20 20 20 20 20 20 28 69 64 65 6e 74 69 66 69         (identifi
3a70: 65 72 3f 20 28 73 79 6e 74 61 78 20 74 61 67 29  er? (syntax tag)
3a80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3a90: 20 20 20 28 6c 65 74 20 28 5b 62 6f 64 79 2d 65     (let ([body-e
3aa0: 78 70 20 28 63 61 72 20 28 67 65 6e 65 72 61 74  xp (car (generat
3ab0: 65 2d 74 65 6d 70 6f 72 61 72 69 65 73 20 28 6c  e-temporaries (l
3ac0: 69 73 74 20 65 78 70 29 29 29 5d 29 0a 20 20 20  ist exp)))]).   
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 5b 28 74  (let-values ([(t
3af0: 65 73 74 73 20 6e 65 77 2d 70 76 61 72 2d 6c 73  ests new-pvar-ls
3b00: 74 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 20  t new-cata-defs 
3b10: 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  new-dotted-vars)
3b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 28 63 6f 6d 70 69 6c 65 2d 69 74 65 6d 2d    (compile-item-
3b50: 6c 69 73 74 20 28 73 79 6e 74 61 78 20 69 74 65  list (syntax ite
3b60: 6d 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ms).            
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b90: 20 20 20 20 20 20 20 20 62 6f 64 79 2d 65 78 70          body-exp
3ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 6e 65 78 74 70 0a 20 20 20 20 20       nextp.     
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
3c10: 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20 20 20  ail-k.          
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 20 20 20 20 20 20 20 20 20 20 23 74 0a 20 20 20            #t.   
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20   pvar-lst.      
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
3cc0: 70 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 20  pth.            
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75 6e          cata-fun
3d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 63 61 74 61 2d 64 65 66 73 0a 20       cata-defs. 
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d     dotted-vars)]
3d80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3d90: 20 20 20 20 20 20 20 28 76 61 6c 75 65 73 20 28         (values (
3da0: 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 78 20  with-syntax ([x 
3db0: 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20  exp].           
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 5b 62 78 20 62 6f 64 79 2d 65 78 70 5d 0a 20 20  [bx body-exp].  
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 20 20 20 20 5b 62 6f 64 79 20 74           [body t
3e20: 65 73 74 73 5d 0a 20 20 20 20 20 20 20 20 20 20  ests].          
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 5b 66 61 69 6c 2d 74 6f 20 66 61 69 6c 2d 6b   [fail-to fail-k
3e60: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e80: 20 20 28 73 79 6e 74 61 78 20 28 69 66 20 28 61    (syntax (if (a
3e90: 6e 64 20 28 70 61 69 72 3f 20 78 29 20 28 65 71  nd (pair? x) (eq
3ea0: 3f 20 27 74 61 67 20 28 78 6d 6c 2d 65 6c 65 6d  ? 'tag (xml-elem
3eb0: 65 6e 74 2d 74 61 67 20 78 29 29 29 0a 20 20 20  ent-tag x))).   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 62          (let ([b
3ef0: 78 20 28 78 6d 6c 2d 65 6c 65 6d 65 6e 74 2d 63  x (xml-element-c
3f00: 6f 6e 74 65 6e 74 73 20 78 29 5d 29 0a 20 20 20  ontents x)]).   
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 20 20 20 20 20 20 20 62 6f 64 79 29 0a            body).
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 20 20 20 20 20 20 20 20 20 20 28 66 61 69 6c             (fail
3f70: 2d 74 6f 29 29 29 29 0a 20 20 20 20 20 20 20 20  -to)))).        
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73       new-pvar-ls
3fa0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
3fc0: 65 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20  ew-cata-defs.   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 64 6f            new-do
3ff0: 74 74 65 64 2d 76 61 72 73 29 29 29 5d 29 29 5d  tted-vars)))]))]
4000: 0a 20 20 20 20 20 20 20 20 20 20 20 5b 63 6f 6d  .           [com
4010: 70 69 6c 65 2d 65 6e 64 2d 65 6c 65 6d 65 6e 74  pile-end-element
4020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61  .            (la
4030: 6d 62 64 61 20 28 65 78 70 20 6e 65 78 74 70 20  mbda (exp nextp 
4040: 66 61 69 6c 2d 6b 20 70 76 61 72 2d 6c 73 74 20  fail-k pvar-lst 
4050: 63 61 74 61 2d 64 65 66 73 20 64 6f 74 74 65 64  cata-defs dotted
4060: 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20 20  -vars).         
4070: 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73       (let-values
4080: 20 28 5b 28 6e 65 78 74 2d 74 65 73 74 73 20 6e   ([(next-tests n
4090: 65 77 2d 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d  ew-pvar-lst new-
40a0: 63 61 74 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f  cata-defs new-do
40b0: 74 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20  tted-vars).     
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 20 20 20 28 6e 65 78 74 70 20 70 76         (nextp pv
40e0: 61 72 2d 6c 73 74 20 63 61 74 61 2d 64 65 66 73  ar-lst cata-defs
40f0: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a   dotted-vars)]).
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73 79  (values (with-sy
4120: 6e 74 61 78 20 28 5b 78 20 65 78 70 5d 0a 20 20  ntax ([x exp].  
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 5b 62 6f 64 79 20 6e 65 78 74 2d 74      [body next-t
4160: 65 73 74 73 5d 0a 20 20 20 20 20 20 20 20 20 20  ests].          
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 61 69              [fai
4190: 6c 2d 74 6f 20 66 61 69 6c 2d 6b 5d 29 0a 20 20  l-to fail-k]).  
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
41c0: 28 69 66 20 28 6e 75 6c 6c 3f 20 78 29 20 62 6f  (if (null? x) bo
41d0: 64 79 20 28 66 61 69 6c 2d 74 6f 29 29 29 29 0a  dy (fail-to)))).
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 20 20 6e 65 77 2d 70 76 61 72          new-pvar
4200: 2d 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  -lst.           
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
4220: 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20  -cata-defs.     
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61     new-dotted-va
4250: 72 73 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20  rs)))].         
4260: 20 20 5b 63 6f 6d 70 69 6c 65 2d 61 74 74 72 2d    [compile-attr-
4270: 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  list.           
4280: 20 28 6c 61 6d 62 64 61 20 28 61 74 74 72 2d 6c   (lambda (attr-l
4290: 73 74 20 62 6f 64 79 2d 6c 73 74 20 61 74 74 72  st body-lst attr
42a0: 2d 65 78 70 20 62 6f 64 79 2d 65 78 70 20 61 74  -exp body-exp at
42b0: 74 72 2d 6b 65 79 2d 6c 73 74 20 6e 65 78 74 70  tr-key-lst nextp
42c0: 20 66 61 69 6c 2d 6b 20 70 76 61 72 2d 6c 73 74   fail-k pvar-lst
42d0: 20 64 65 70 74 68 20 63 61 74 61 2d 66 75 6e 20   depth cata-fun 
42e0: 63 61 74 61 2d 64 65 66 73 20 64 6f 74 74 65 64  cata-defs dotted
42f0: 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20 20  -vars).         
4300: 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63 61 73       (syntax-cas
4310: 65 20 61 74 74 72 2d 6c 73 74 20 28 75 6e 71 75  e attr-lst (unqu
4320: 6f 74 65 20 2d 3e 29 0a 20 20 20 20 20 20 20 20  ote ->).        
4330: 20 20 20 20 20 20 20 20 5b 28 75 6e 71 75 6f 74          [(unquot
4340: 65 20 76 61 72 29 0a 20 20 20 20 20 20 20 20 20  e var).         
4350: 20 20 20 20 20 20 20 20 28 69 64 65 6e 74 69 66          (identif
4360: 69 65 72 3f 20 28 73 79 6e 74 61 78 20 76 61 72  ier? (syntax var
4370: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
4380: 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20      (let-values 
4390: 28 5b 28 74 65 73 74 73 20 6e 65 77 2d 70 76 61  ([(tests new-pva
43a0: 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d 64  r-lst new-cata-d
43b0: 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76  efs new-dotted-v
43c0: 61 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ars).           
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 69 74 65      (compile-ite
43f0: 6d 2d 6c 69 73 74 20 62 6f 64 79 2d 6c 73 74 0a  m-list body-lst.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 20 20 62 6f 64 79 2d 65 78 70 0a 20 20 20 20 20    body-exp.     
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
4470: 74 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  tp.             
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20       fail-k.    
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 74                #t
44e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 28 61 64 64 2d 70 61 74 2d 76 61 72 20     (add-pat-var 
4520: 28 73 79 6e 74 61 78 20 76 61 72 29 20 70 76 61  (syntax var) pva
4530: 72 2d 6c 73 74 29 0a 20 20 20 20 20 20 20 20 20  r-lst).         
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 20 20 20 20 64 65 70 74 68 0a 20           depth. 
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20 20   cata-fun.      
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 61              cata
45e0: 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20  -defs.          
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 64 6f 74 74 65 64 2d 76          dotted-v
4620: 61 72 73 29 5d 29 0a 20 20 20 20 20 20 20 20 20  ars)]).         
4630: 20 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65            (value
4640: 73 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20 28  s (with-syntax (
4650: 5b 61 78 20 61 74 74 72 2d 65 78 70 5d 0a 20 20  [ax attr-exp].  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 20 20 5b 6d 61 74 63 68 65 64 2d         [matched-
4690: 61 74 74 72 73 20 61 74 74 72 2d 6b 65 79 2d 6c  attrs attr-key-l
46a0: 73 74 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st].            
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 62 6f               [bo
46d0: 64 79 20 74 65 73 74 73 5d 29 0a 20 20 20 20 20  dy tests]).     
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
4700: 28 6c 65 74 20 28 5b 76 61 72 20 28 66 69 6c 74  (let ([var (filt
4710: 65 72 2d 61 74 74 72 69 62 75 74 65 73 20 27 6d  er-attributes 'm
4720: 61 74 63 68 65 64 2d 61 74 74 72 73 20 61 78 29  atched-attrs ax)
4730: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 20 20 20 20 20 20 20 20 20 62 6f 64 79 29 29            body))
4760: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
4780: 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20  -pvar-lst.      
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 20 6e 65 77 2d 63 61 74 61 2d 64 65       new-cata-de
47b0: 66 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  fs.             
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
47d0: 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 29 5d  w-dotted-vars))]
47e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
47f0: 20 5b 28 28 61 74 61 67 20 5b 28 75 6e 71 75 6f   [((atag [(unquo
4800: 74 65 20 5b 63 61 74 61 20 2d 3e 20 63 76 61 72  te [cata -> cvar
4810: 20 2e 2e 2e 5d 29 20 64 65 66 61 75 6c 74 5d 29   ...]) default])
4820: 20 2e 20 72 73 74 29 0a 20 20 20 20 20 20 20 20   . rst).        
4830: 20 20 20 20 20 20 20 20 20 28 69 64 65 6e 74 69           (identi
4840: 66 69 65 72 3f 20 28 73 79 6e 74 61 78 20 61 74  fier? (syntax at
4850: 61 67 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ag)).           
4860: 20 20 20 20 20 20 28 6c 65 74 20 28 5b 63 74 65        (let ([cte
4870: 6d 70 20 28 63 61 72 20 28 67 65 6e 65 72 61 74  mp (car (generat
4880: 65 2d 74 65 6d 70 6f 72 61 72 69 65 73 20 28 73  e-temporaries (s
4890: 79 6e 74 61 78 20 28 5b 63 76 61 72 20 2e 2e 2e  yntax ([cvar ...
48a0: 5d 29 29 29 29 5d 29 0a 20 20 20 20 20 20 20 20  ]))))]).        
48b0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 2d             (let-
48c0: 76 61 6c 75 65 73 20 28 5b 28 74 65 73 74 73 20  values ([(tests 
48d0: 6e 65 77 2d 70 76 61 72 2d 6c 73 74 20 6e 65 77  new-pvar-lst new
48e0: 2d 63 61 74 61 2d 64 65 66 73 20 6e 65 77 2d 64  -cata-defs new-d
48f0: 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20  otted-vars).    
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
4920: 6d 70 69 6c 65 2d 61 74 74 72 2d 6c 69 73 74 20  mpile-attr-list 
4930: 28 73 79 6e 74 61 78 20 72 73 74 29 0a 20 20 20  (syntax rst).   
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 62 6f 64 79 2d 6c 73 74 0a 20 20 20 20 20 20   body-lst.      
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
49b0: 74 72 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20  tr-exp.         
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 64 79 2d             body-
49f0: 65 78 70 0a 20 20 20 20 20 20 20 20 20 20 20 20  exp.            
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 20 28 73          (cons (s
4a30: 79 6e 74 61 78 20 61 74 61 67 29 20 61 74 74 72  yntax atag) attr
4a40: 2d 6b 65 79 2d 6c 73 74 29 0a 20 20 20 20 20 20  -key-lst).      
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
4a80: 78 74 70 0a 20 20 20 20 20 20 20 20 20 20 20 20  xtp.            
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 66 61 69 6c 2d 6b 0a 20          fail-k. 
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 28 61 64 64 2d 70 61 74 2d 76 61 72 20     (add-pat-var 
4b00: 63 74 65 6d 70 20 70 76 61 72 2d 6c 73 74 29 0a  ctemp pvar-lst).
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 64 65 70 74 68 0a 20 20 20 20 20 20      depth.      
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
4b80: 74 61 2d 66 75 6e 0a 20 20 20 20 20 20 20 20 20  ta-fun.         
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 20 20 20 20 20 20 28 61 64 64 2d             (add-
4bc0: 63 61 74 61 2d 64 65 66 20 64 65 70 74 68 0a 20  cata-def depth. 
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 28 73 79 6e 74 61 78 20 5b 63 76 61 72 20 2e   (syntax [cvar .
4c20: 2e 2e 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  ..]).           
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 63         (syntax c
4c70: 61 74 61 29 0a 20 20 20 20 20 20 20 20 20 20 20  ata).           
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 20 20 63 74 65 6d 70 0a 20 20 20         ctemp.   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4d00: 61 74 61 2d 64 65 66 73 29 0a 20 20 20 20 20 20  ata-defs).      
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
4d40: 74 74 65 64 2d 76 61 72 73 29 5d 29 0a 20 20 20  tted-vars)]).   
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d    (values (with-
4d70: 73 79 6e 74 61 78 20 28 5b 61 78 20 61 74 74 72  syntax ([ax attr
4d80: 2d 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20  -exp].          
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 5b 63 74 20 63 74 65 6d 70 5d 0a 20 20 20 20   [ct ctemp].    
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 20 20 20 5b 62 6f 64 79 20 74 65 73         [body tes
4df0: 74 73 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  ts]).           
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c 65 74      (syntax (let
4e20: 20 28 5b 62 69 6e 64 69 6e 67 20 28 6d 61 74 63   ([binding (matc
4e30: 68 2d 78 6d 6c 2d 61 74 74 72 69 62 75 74 65 20  h-xml-attribute 
4e40: 27 61 74 61 67 20 61 78 29 5d 29 0a 20 20 20 20  'atag ax)]).    
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 28 6c 65 74 20 28 5b 63 74 20 28       (let ([ct (
4e80: 69 66 20 62 69 6e 64 69 6e 67 0a 20 20 20 20 20  if binding.     
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 28 63 61 64 72 20 62 69 6e 64 69 6e 67 29    (cadr binding)
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 29          default)
4f10: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
4f40: 64 79 29 29 29 29 0a 20 20 20 20 20 20 20 20 20  dy)))).         
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f60: 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74      new-pvar-lst
4f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
4f90: 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20  w-cata-defs.    
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 20 20 20 20 20 6e 65 77 2d 64 6f 74           new-dot
4fc0: 74 65 64 2d 76 61 72 73 29 29 29 5d 0a 20 20 20  ted-vars)))].   
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 28               [((
4fe0: 61 74 61 67 20 5b 28 75 6e 71 75 6f 74 65 20 5b  atag [(unquote [
4ff0: 63 76 61 72 20 2e 2e 2e 5d 29 20 64 65 66 61 75  cvar ...]) defau
5000: 6c 74 5d 29 20 2e 20 72 73 74 29 0a 20 20 20 20  lt]) . rst).    
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 64               (id
5020: 65 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61  entifier? (synta
5030: 78 20 61 74 61 67 29 29 0a 20 20 20 20 20 20 20  x atag)).       
5040: 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28            (let (
5050: 5b 63 74 65 6d 70 20 28 63 61 72 20 28 67 65 6e  [ctemp (car (gen
5060: 65 72 61 74 65 2d 74 65 6d 70 6f 72 61 72 69 65  erate-temporarie
5070: 73 20 28 73 79 6e 74 61 78 20 28 5b 63 76 61 72  s (syntax ([cvar
5080: 20 2e 2e 2e 5d 29 29 29 29 5d 29 0a 20 20 20 20   ...]))))]).    
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
50a0: 69 66 20 28 6e 6f 74 20 63 61 74 61 2d 66 75 6e  if (not cata-fun
50b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
50c0: 20 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d 6d           (sxml-m
50d0: 61 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f  atch-syntax-erro
50e0: 72 20 22 73 78 6d 6c 2d 6d 61 74 63 68 20 70 61  r "sxml-match pa
50f0: 74 74 65 72 6e 3a 20 63 61 74 61 6d 6f 72 70 68  ttern: catamorph
5100: 69 73 6d 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ism not allowed 
5110: 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 22  in this context"
5120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 73 74 78 0a 20 20 20 20 20 20 20 20 20 20 20   stx.           
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 20 20 20 20 28 73 79 6e 74 61 78 20 5b 63 76       (syntax [cv
5190: 61 72 20 2e 2e 2e 5d 29 29 29 0a 20 20 20 20 20  ar ...]))).     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
51b0: 65 74 2d 76 61 6c 75 65 73 20 28 5b 28 74 65 73  et-values ([(tes
51c0: 74 73 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 20  ts new-pvar-lst 
51d0: 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 20 6e 65  new-cata-defs ne
51e0: 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 0a 20  w-dotted-vars). 
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 28 63 6f 6d 70 69 6c 65 2d 61 74 74 72 2d 6c 69  (compile-attr-li
5220: 73 74 20 28 73 79 6e 74 61 78 20 72 73 74 29 0a  st (syntax rst).
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 62 6f 64 79 2d 6c 73 74 0a 20 20 20      body-lst.   
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 61 74 74 72 2d 65 78 70 0a 20 20 20 20 20 20   attr-exp.      
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
52e0: 64 79 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20  dy-exp.         
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73             (cons
5320: 20 28 73 79 6e 74 61 78 20 61 74 61 67 29 20 61   (syntax atag) a
5330: 74 74 72 2d 6b 65 79 2d 6c 73 74 29 0a 20 20 20  ttr-key-lst).   
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 6e 65 78 74 70 0a 20 20 20 20 20 20 20 20 20   nextp.         
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 2d             fail-
53b0: 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k.              
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 28 61 64 64 2d 70 61 74 2d 76        (add-pat-v
53f0: 61 72 20 63 74 65 6d 70 20 70 76 61 72 2d 6c 73  ar ctemp pvar-ls
5400: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 20 20 20 20 64 65 70 74 68 0a 20 20 20         depth.   
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20 20   cata-fun.      
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
54b0: 64 64 2d 63 61 74 61 2d 64 65 66 20 64 65 70 74  dd-cata-def dept
54c0: 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 28 73 79 6e 74 61 78 20 5b 63 76 61      (syntax [cva
5510: 72 20 2e 2e 2e 5d 29 0a 20 20 20 20 20 20 20 20  r ...]).        
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66            cata-f
5560: 75 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  un.             
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 20 63 74 65 6d 70 0a 20 20 20 20 20       ctemp.     
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
55f0: 61 2d 64 65 66 73 29 0a 20 20 20 20 20 20 20 20  a-defs).        
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 74 74              dott
5630: 65 64 2d 76 61 72 73 29 5d 29 0a 20 20 20 20 20  ed-vars)]).     
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73 79  (values (with-sy
5660: 6e 74 61 78 20 28 5b 61 78 20 61 74 74 72 2d 65  ntax ([ax attr-e
5670: 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp].            
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
56a0: 63 74 20 63 74 65 6d 70 5d 0a 20 20 20 20 20 20  ct ctemp].      
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 20 20 5b 62 6f 64 79 20 74 65 73 74 73       [body tests
56e0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 28 73 79 6e 74 61 78 20 28 6c 65 74 20 28    (syntax (let (
5710: 5b 62 69 6e 64 69 6e 67 20 28 6d 61 74 63 68 2d  [binding (match-
5720: 78 6d 6c 2d 61 74 74 72 69 62 75 74 65 20 27 61  xml-attribute 'a
5730: 74 61 67 20 61 78 29 5d 29 0a 20 20 20 20 20 20  tag ax)]).      
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 28 6c 65 74 20 28 5b 63 74 20 28 69 66     (let ([ct (if
5770: 20 62 69 6e 64 69 6e 67 0a 20 20 20 20 20 20 20   binding.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 28 63 61 64 72 20 62 69 6e 64 69 6e 67 29 0a 20  (cadr binding). 
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 29 5d 29        default)])
5800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 64 79              body
5830: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20    new-pvar-lst. 
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d              new-
5880: 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20 20  cata-defs.      
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 20 20 20 20 6e 65 77 2d 64 6f 74 74 65         new-dotte
58b0: 64 2d 76 61 72 73 29 29 29 5d 0a 20 20 20 20 20  d-vars)))].     
58c0: 20 20 20 20 20 20 20 20 20 20 20 5b 28 28 61 74             [((at
58d0: 61 67 20 5b 28 75 6e 71 75 6f 74 65 20 76 61 72  ag [(unquote var
58e0: 29 20 64 65 66 61 75 6c 74 5d 29 20 2e 20 72 73  ) default]) . rs
58f0: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
5900: 20 20 20 20 28 61 6e 64 20 28 69 64 65 6e 74 69      (and (identi
5910: 66 69 65 72 3f 20 28 73 79 6e 74 61 78 20 61 74  fier? (syntax at
5920: 61 67 29 29 20 28 69 64 65 6e 74 69 66 69 65 72  ag)) (identifier
5930: 3f 20 28 73 79 6e 74 61 78 20 76 61 72 29 29 29  ? (syntax var)))
5940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5950: 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 5b    (let-values ([
5960: 28 74 65 73 74 73 20 6e 65 77 2d 70 76 61 72 2d  (tests new-pvar-
5970: 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d 64 65 66  lst new-cata-def
5980: 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72  s new-dotted-var
5990: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 28 63 6f 6d 70 69 6c 65 2d 61 74 74 72 2d    (compile-attr-
59c0: 6c 69 73 74 20 28 73 79 6e 74 61 78 20 72 73 74  list (syntax rst
59d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 62 6f 64 79 2d 6c 73 74 0a 20 20 20      body-lst.   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5a40: 74 74 72 2d 65 78 70 0a 20 20 20 20 20 20 20 20  ttr-exp.        
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 20 20 20 20 20 20 20 20 62 6f 64 79 2d 65            body-e
5a80: 78 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  xp.             
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 28 63 6f 6e 73 20 28 73 79 6e 74       (cons (synt
5ac0: 61 78 20 61 74 61 67 29 20 61 74 74 72 2d 6b 65  ax atag) attr-ke
5ad0: 79 2d 6c 73 74 29 0a 20 20 20 20 20 20 20 20 20  y-lst).         
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 20 20 20 20 20 6e 65 78 74 70 0a 20           nextp. 
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20   fail-k.        
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 20 20 20 20 28 61 64 64 2d 70            (add-p
5b80: 61 74 2d 76 61 72 20 28 73 79 6e 74 61 78 20 76  at-var (syntax v
5b90: 61 72 29 20 70 76 61 72 2d 6c 73 74 29 0a 20 20  ar) pvar-lst).  
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 64 65 70 74 68 0a 20 20 20 20 20 20 20 20 20 20  depth.          
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75 6e          cata-fun
5c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 20 63 61 74 61 2d 64 65 66 73 0a 20 20 20     cata-defs.   
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5c80: 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a 20 20  otted-vars)]).  
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73   (values (with-s
5cb0: 79 6e 74 61 78 20 28 5b 61 78 20 61 74 74 72 2d  yntax ([ax attr-
5cc0: 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20  exp].           
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 62                [b
5cf0: 6f 64 79 20 74 65 73 74 73 5d 29 0a 20 20 20 20  ody tests]).    
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
5d20: 20 28 6c 65 74 20 28 5b 62 69 6e 64 69 6e 67 20   (let ([binding 
5d30: 28 6d 61 74 63 68 2d 78 6d 6c 2d 61 74 74 72 69  (match-xml-attri
5d40: 62 75 74 65 20 27 61 74 61 67 20 61 78 29 5d 29  bute 'atag ax)])
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 76          (let ([v
5d80: 61 72 20 28 69 66 20 62 69 6e 64 69 6e 67 0a 20  ar (if binding. 
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 28 63 61 64 72 20 62 69 6e 64 69       (cadr bindi
5dd0: 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng).            
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
5e10: 74 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  t)]).           
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
5e40: 64 79 29 29 29 29 0a 20 20 20 20 20 20 20 20 20  dy)))).         
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20    new-pvar-lst. 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61            new-ca
5e90: 74 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20  ta-defs.        
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61     new-dotted-va
5ec0: 72 73 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  rs))].          
5ed0: 20 20 20 20 20 20 5b 28 28 61 74 61 67 20 28 75        [((atag (u
5ee0: 6e 71 75 6f 74 65 20 5b 63 61 74 61 20 2d 3e 20  nquote [cata -> 
5ef0: 63 76 61 72 20 2e 2e 2e 5d 29 29 20 2e 20 72 73  cvar ...])) . rs
5f00: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
5f10: 20 20 20 20 28 69 64 65 6e 74 69 66 69 65 72 3f      (identifier?
5f20: 20 28 73 79 6e 74 61 78 20 61 74 61 67 29 29 0a   (syntax atag)).
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 28 6c 65 74 20 28 5b 63 74 65 6d 70 20 28 63   (let ([ctemp (c
5f50: 61 72 20 28 67 65 6e 65 72 61 74 65 2d 74 65 6d  ar (generate-tem
5f60: 70 6f 72 61 72 69 65 73 20 28 73 79 6e 74 61 78  poraries (syntax
5f70: 20 28 5b 63 76 61 72 20 2e 2e 2e 5d 29 29 29 29   ([cvar ...]))))
5f80: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
5f90: 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65        (let-value
5fa0: 73 20 28 5b 28 74 65 73 74 73 20 6e 65 77 2d 70  s ([(tests new-p
5fb0: 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61  var-lst new-cata
5fc0: 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64  -defs new-dotted
5fd0: 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20 20  -vars).         
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 20 28 63 6f 6d 70 69 6c 65          (compile
6000: 2d 61 74 74 72 2d 6c 69 73 74 20 28 73 79 6e 74  -attr-list (synt
6010: 61 78 20 72 73 74 29 0a 20 20 20 20 20 20 20 20  ax rst).        
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 64 79              body
6050: 2d 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  -lst.           
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 20 20 20 20 20 61 74 74 72 2d 65 78           attr-ex
6090: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 62 6f 64 79 2d 65 78 70 0a 20        body-exp. 
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 28 63 6f 6e 73 20 28 73 79 6e 74 61 78     (cons (syntax
6110: 20 61 74 61 67 29 20 61 74 74 72 2d 6b 65 79 2d   atag) attr-key-
6120: 6c 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  lst).           
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 20 20 20 20 20 6e 65 78 74 70 0a 20           nextp. 
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20     fail-k.      
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
61d0: 64 64 2d 70 61 74 2d 76 61 72 20 63 74 65 6d 70  dd-pat-var ctemp
61e0: 20 70 76 61 72 2d 6c 73 74 29 0a 20 20 20 20 20   pvar-lst).     
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
6220: 65 70 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  epth.           
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75           cata-fu
6260: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 28 61 64 64 2d 63 61 74 61 2d        (add-cata-
62a0: 64 65 66 20 64 65 70 74 68 0a 20 20 20 20 20 20  def depth.      
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
62f0: 74 61 78 20 5b 63 76 61 72 20 2e 2e 2e 5d 29 0a  tax [cvar ...]).
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 28 73 79 6e 74 61 78 20 63 61 74 61 29 0a    (syntax cata).
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 63 74 65 6d 70 0a 20 20 20 20 20 20 20 20    ctemp.        
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 64            cata-d
63e0: 65 66 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  efs).           
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 20 20 20 20 20 20 20 64 6f 74 74 65 64 2d           dotted-
6420: 76 61 72 73 29 5d 29 0a 20 20 20 20 20 20 20 20  vars)]).        
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 61               (va
6440: 6c 75 65 73 20 28 77 69 74 68 2d 73 79 6e 74 61  lues (with-synta
6450: 78 20 28 5b 61 78 20 61 74 74 72 2d 65 78 70 5d  x ([ax attr-exp]
6460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 74 20              [ct 
6490: 63 74 65 6d 70 5d 0a 20 20 20 20 20 20 20 20 20  ctemp].         
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 5b 62 6f 64 79 20 74 65 73 74 73 5d 0a 20    [body tests]. 
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 20 20 5b 66 61 69 6c 2d            [fail-
6500: 74 6f 20 66 61 69 6c 2d 6b 5d 29 0a 20 20 20 20  to fail-k]).    
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6520: 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74             (synt
6530: 61 78 20 28 6c 65 74 20 28 5b 62 69 6e 64 69 6e  ax (let ([bindin
6540: 67 20 28 6d 61 74 63 68 2d 78 6d 6c 2d 61 74 74  g (match-xml-att
6550: 72 69 62 75 74 65 20 27 61 74 61 67 20 61 78 29  ribute 'atag ax)
6560: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20              (if 
6590: 62 69 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20  binding.        
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 20 20 28 6c 65 74 20 28 5b 63 74 20 28       (let ([ct (
65d0: 63 61 64 72 20 62 69 6e 64 69 6e 67 29 5d 29 0a  cadr binding)]).
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
6610: 6f 64 79 29 0a 20 20 20 20 20 20 20 20 20 20 20  ody).           
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 28 66 61 69 6c 2d 74 6f 29 29 29 29 29 0a    (fail-to))))).
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
6670: 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20  -pvar-lst.      
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74 61 2d         new-cata-
66a0: 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20 20  defs.           
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72    new-dotted-var
66d0: 73 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  s)))].          
66e0: 20 20 20 20 20 20 5b 28 28 61 74 61 67 20 28 75        [((atag (u
66f0: 6e 71 75 6f 74 65 20 5b 63 76 61 72 20 2e 2e 2e  nquote [cvar ...
6700: 5d 29 29 20 2e 20 72 73 74 29 0a 20 20 20 20 20  ])) . rst).     
6710: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 64 65              (ide
6720: 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78  ntifier? (syntax
6730: 20 61 74 61 67 29 29 0a 20 20 20 20 20 20 20 20   atag)).        
6740: 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b           (let ([
6750: 63 74 65 6d 70 20 28 63 61 72 20 28 67 65 6e 65  ctemp (car (gene
6760: 72 61 74 65 2d 74 65 6d 70 6f 72 61 72 69 65 73  rate-temporaries
6770: 20 28 73 79 6e 74 61 78 20 28 5b 63 76 61 72 20   (syntax ([cvar 
6780: 2e 2e 2e 5d 29 29 29 29 5d 29 0a 20 20 20 20 20  ...]))))]).     
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
67a0: 66 20 28 6e 6f 74 20 63 61 74 61 2d 66 75 6e 29  f (not cata-fun)
67b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
67c0: 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d 6d 61          (sxml-ma
67d0: 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f 72  tch-syntax-error
67e0: 20 22 73 78 6d 6c 2d 6d 61 74 63 68 20 70 61 74   "sxml-match pat
67f0: 74 65 72 6e 3a 20 63 61 74 61 6d 6f 72 70 68 69  tern: catamorphi
6800: 73 6d 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  sm not allowed i
6810: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 22 0a  n this context".
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 73 74 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  stx.            
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 28 73 79 6e 74 61 78 20 5b 63 76 61      (syntax [cva
6890: 72 20 2e 2e 2e 5d 29 29 29 0a 20 20 20 20 20 20  r ...]))).      
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65               (le
68b0: 74 2d 76 61 6c 75 65 73 20 28 5b 28 74 65 73 74  t-values ([(test
68c0: 73 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 20 6e  s new-pvar-lst n
68d0: 65 77 2d 63 61 74 61 2d 64 65 66 73 20 6e 65 77  ew-cata-defs new
68e0: 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20  -dotted-vars).  
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6910: 63 6f 6d 70 69 6c 65 2d 61 74 74 72 2d 6c 69 73  compile-attr-lis
6920: 74 20 28 73 79 6e 74 61 78 20 72 73 74 29 0a 20  t (syntax rst). 
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 62 6f 64 79 2d 6c 73 74 0a 20 20 20 20     body-lst.    
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 61 74 74 72 2d 65 78 70 0a 20 20 20 20 20 20 20  attr-exp.       
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 64               bod
69e0: 79 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20 20  y-exp.          
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 20            (cons 
6a20: 28 73 79 6e 74 61 78 20 61 74 61 67 29 20 61 74  (syntax atag) at
6a30: 74 72 2d 6b 65 79 2d 6c 73 74 29 0a 20 20 20 20  tr-key-lst).    
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 6e 65 78 74 70 0a 20 20 20 20 20 20 20 20 20 20  nextp.          
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 2d 6b            fail-k
6ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 20 28 61 64 64 2d 70 61 74 2d 76 61       (add-pat-va
6af0: 72 20 63 74 65 6d 70 20 70 76 61 72 2d 6c 73 74  r ctemp pvar-lst
6b00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 20 20 20 20 20 64 65 70 74 68 0a 20 20 20 20        depth.    
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20 20 20  cata-fun.       
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 64               (ad
6bb0: 64 2d 63 61 74 61 2d 64 65 66 20 64 65 70 74 68  d-cata-def depth
6bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 28 73 79 6e 74 61 78 20 5b 63 76 61 72     (syntax [cvar
6c10: 20 2e 2e 2e 5d 29 0a 20 20 20 20 20 20 20 20 20   ...]).         
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75           cata-fu
6c60: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 20 20 63 74 65 6d 70 0a 20 20 20 20 20 20      ctemp.      
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 61              cata
6cf0: 2d 64 65 66 73 29 0a 20 20 20 20 20 20 20 20 20  -defs).         
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 20 20 20 20 20 20 64 6f 74 74 65             dotte
6d30: 64 2d 76 61 72 73 29 5d 29 0a 20 20 20 20 20 20  d-vars)]).      
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6d50: 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73 79 6e  values (with-syn
6d60: 74 61 78 20 28 5b 61 78 20 61 74 74 72 2d 65 78  tax ([ax attr-ex
6d70: 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p].             
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 63                [c
6da0: 74 20 63 74 65 6d 70 5d 0a 20 20 20 20 20 20 20  t ctemp].       
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 20 20 20 5b 62 6f 64 79 20 74 65 73 74 73 5d      [body tests]
6de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 61 69              [fai
6e10: 6c 2d 74 6f 20 66 61 69 6c 2d 6b 5d 29 0a 20 20  l-to fail-k]).  
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79               (sy
6e40: 6e 74 61 78 20 28 6c 65 74 20 28 5b 62 69 6e 64  ntax (let ([bind
6e50: 69 6e 67 20 28 6d 61 74 63 68 2d 78 6d 6c 2d 61  ing (match-xml-a
6e60: 74 74 72 69 62 75 74 65 20 27 61 74 61 67 20 61  ttribute 'atag a
6e70: 78 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  x)]).           
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
6ea0: 66 20 62 69 6e 64 69 6e 67 0a 20 20 20 20 20 20  f binding.      
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 63 74         (let ([ct
6ee0: 20 28 63 61 64 72 20 62 69 6e 64 69 6e 67 29 5d   (cadr binding)]
6ef0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 20 62 6f 64 79 29 0a 20 20 20 20 20 20 20 20 20   body).         
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 20 28 66 61 69 6c 2d 74 6f 29 29 29 29      (fail-to))))
6f60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
6f80: 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20  ew-pvar-lst.    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74           new-cat
6fb0: 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20  a-defs.         
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76      new-dotted-v
6fe0: 61 72 73 29 29 29 5d 0a 20 20 20 20 20 20 20 20  ars)))].        
6ff0: 20 20 20 20 20 20 20 20 5b 28 28 61 74 61 67 20          [((atag 
7000: 28 75 6e 71 75 6f 74 65 20 76 61 72 29 29 20 2e  (unquote var)) .
7010: 20 72 73 74 29 0a 20 20 20 20 20 20 20 20 20 20   rst).          
7020: 20 20 20 20 20 20 20 28 61 6e 64 20 28 69 64 65         (and (ide
7030: 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78  ntifier? (syntax
7040: 20 61 74 61 67 29 29 20 28 69 64 65 6e 74 69 66   atag)) (identif
7050: 69 65 72 3f 20 28 73 79 6e 74 61 78 20 76 61 72  ier? (syntax var
7060: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
7070: 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73       (let-values
7080: 20 28 5b 28 74 65 73 74 73 20 6e 65 77 2d 70 76   ([(tests new-pv
7090: 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d  ar-lst new-cata-
70a0: 64 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d  defs new-dotted-
70b0: 76 61 72 73 29 0a 20 20 20 20 20 20 20 20 20 20  vars).          
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 61 74       (compile-at
70e0: 74 72 2d 6c 69 73 74 20 28 73 79 6e 74 61 78 20  tr-list (syntax 
70f0: 72 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  rst).           
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 20 20 20 20 20 62 6f 64 79 2d 6c 73 74 0a         body-lst.
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7160: 20 20 61 74 74 72 2d 65 78 70 0a 20 20 20 20 20    attr-exp.     
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 64               bod
71a0: 79 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20 20  y-exp.          
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 20 20 28 63 6f 6e 73 20 28 73          (cons (s
71e0: 79 6e 74 61 78 20 61 74 61 67 29 20 61 74 74 72  yntax atag) attr
71f0: 2d 6b 65 79 2d 6c 73 74 29 0a 20 20 20 20 20 20  -key-lst).      
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
7230: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20      fail-k.     
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 64               (ad
72a0: 64 2d 70 61 74 2d 76 61 72 20 28 73 79 6e 74 61  d-pat-var (synta
72b0: 78 20 76 61 72 29 20 70 76 61 72 2d 6c 73 74 29  x var) pvar-lst)
72c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 64 65 70 74 68 0a 20 20 20 20 20 20 20     depth.       
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d             cata-
7330: 66 75 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  fun.            
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 20 63 61 74 61 2d 64 65 66 73 0a        cata-defs.
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29    dotted-vars)])
73b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
73c0: 20 20 20 20 28 76 61 6c 75 65 73 20 28 77 69 74      (values (wit
73d0: 68 2d 73 79 6e 74 61 78 20 28 5b 61 78 20 61 74  h-syntax ([ax at
73e0: 74 72 2d 65 78 70 5d 0a 20 20 20 20 20 20 20 20  tr-exp].        
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 5b 62 6f 64 79 20 74 65 73 74 73 5d 0a 20 20   [body tests].  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 5b 66 61 69 6c 2d 74 6f 20         [fail-to 
7450: 66 61 69 6c 2d 6b 5d 29 0a 20 20 20 20 20 20 20  fail-k]).       
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c        (syntax (l
7480: 65 74 20 28 5b 62 69 6e 64 69 6e 67 20 28 6d 61  et ([binding (ma
7490: 74 63 68 2d 78 6d 6c 2d 61 74 74 72 69 62 75 74  tch-xml-attribut
74a0: 65 20 27 61 74 61 67 20 61 78 29 5d 29 0a 20 20  e 'atag ax)]).  
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 28 69 66 20 62 69 6e 64 69 6e 67       (if binding
74e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74              (let
7510: 20 28 5b 76 61 72 20 28 63 61 64 72 20 62 69 6e   ([var (cadr bin
7520: 64 69 6e 67 29 5d 29 0a 20 20 20 20 20 20 20 20  ding)]).        
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 20 20 20 20 20 62 6f 64 79 29 0a 20 20 20 20 20       body).     
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 20 20 28 66 61 69 6c 2d 74 6f 29 29        (fail-to))
7590: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
75b0: 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20  ew-pvar-lst.    
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74 61 2d         new-cata-
75e0: 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20 20  defs.           
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7600: 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  new-dotted-vars)
7610: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )].             
7620: 20 20 20 5b 28 28 61 74 61 67 20 28 69 20 2e 2e     [((atag (i ..
7630: 2e 29 29 20 2e 20 72 73 74 29 0a 20 20 20 20 20  .)) . rst).     
7640: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 64 65              (ide
7650: 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78  ntifier? (syntax
7660: 20 61 74 61 67 29 29 0a 20 20 20 20 20 20 20 20   atag)).        
7670: 20 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d 6d           (sxml-m
7680: 61 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f  atch-syntax-erro
7690: 72 20 22 62 61 64 20 61 74 74 72 69 62 75 74 65  r "bad attribute
76a0: 20 70 61 74 74 65 72 6e 22 0a 20 20 20 20 20 20   pattern".      
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76d0: 20 20 20 20 73 74 78 0a 20 20 20 20 20 20 20 20      stx.        
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 28 73 79 6e 74 61 78 20 28 6b 77 64 20 28    (syntax (kwd (
7710: 69 20 2e 2e 2e 29 29 29 29 5d 0a 20 20 20 20 20  i ...))))].     
7720: 20 20 20 20 20 20 20 20 20 20 20 5b 28 28 61 74             [((at
7730: 61 67 20 69 29 20 2e 20 72 73 74 29 0a 20 20 20  ag i) . rst).   
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
7750: 6e 64 20 28 69 64 65 6e 74 69 66 69 65 72 3f 20  nd (identifier? 
7760: 28 73 79 6e 74 61 78 20 61 74 61 67 29 29 20 28  (syntax atag)) (
7770: 69 64 65 6e 74 69 66 69 65 72 3f 20 28 73 79 6e  identifier? (syn
7780: 74 61 78 20 69 29 29 29 0a 20 20 20 20 20 20 20  tax i))).       
7790: 20 20 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d            (sxml-
77a0: 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72  match-syntax-err
77b0: 6f 72 20 22 62 61 64 20 61 74 74 72 69 62 75 74  or "bad attribut
77c0: 65 20 70 61 74 74 65 72 6e 22 0a 20 20 20 20 20  e pattern".     
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 20 20 20 73 74 78 0a 20 20 20 20 20 20 20       stx.       
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 20 20 20 28 73 79 6e 74 61 78 20 28 6b 77 64 20     (syntax (kwd 
7830: 69 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  i)))].          
7840: 20 20 20 20 20 20 5b 28 28 61 74 61 67 20 6c 69        [((atag li
7850: 74 65 72 61 6c 29 20 2e 20 72 73 74 29 0a 20 20  teral) . rst).  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7870: 61 6e 64 20 28 69 64 65 6e 74 69 66 69 65 72 3f  and (identifier?
7880: 20 28 73 79 6e 74 61 78 20 61 74 61 67 29 29 20   (syntax atag)) 
7890: 28 6c 69 74 65 72 61 6c 3f 20 28 73 79 6e 74 61  (literal? (synta
78a0: 78 20 6c 69 74 65 72 61 6c 29 29 29 0a 20 20 20  x literal))).   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
78c0: 65 74 2d 76 61 6c 75 65 73 20 28 5b 28 74 65 73  et-values ([(tes
78d0: 74 73 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 20  ts new-pvar-lst 
78e0: 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 20 6e 65  new-cata-defs ne
78f0: 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 0a 20  w-dotted-vars). 
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
7920: 6f 6d 70 69 6c 65 2d 61 74 74 72 2d 6c 69 73 74  ompile-attr-list
7930: 20 28 73 79 6e 74 61 78 20 72 73 74 29 0a 20 20   (syntax rst).  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 62 6f 64 79 2d 6c 73 74 0a 20 20 20 20 20 20 20  body-lst.       
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 20 20 20 20 20 20 20 20 20 61 74 74 72 2d             attr-
79b0: 65 78 70 0a 20 20 20 20 20 20 20 20 20 20 20 20  exp.            
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 62 6f 64 79 2d 65 78 70 0a 20        body-exp. 
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 28 63 6f 6e 73 20 28 73 79 6e 74 61 78 20 61   (cons (syntax a
7a30: 74 61 67 29 20 61 74 74 72 2d 6b 65 79 2d 6c 73  tag) attr-key-ls
7a40: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 6e 65 78 74 70 0a 20 20 20 20 20       nextp.     
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69               fai
7ab0: 6c 2d 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l-k.            
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 20 20 20 70 76 61 72 2d 6c 73 74 0a 20        pvar-lst. 
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 64 65 70 74 68 0a 20 20 20 20 20 20 20 20 20   depth.         
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75           cata-fu
7b60: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 63 61 74 61 2d 64 65 66 73 0a 20 20      cata-defs.  
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a 20  dotted-vars)]). 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d    (values (with-
7c00: 73 79 6e 74 61 78 20 28 5b 61 78 20 61 74 74 72  syntax ([ax attr
7c10: 2d 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20  -exp].          
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
7c40: 62 6f 64 79 20 74 65 73 74 73 5d 0a 20 20 20 20  body tests].    
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 20 20 20 5b 66 61 69 6c 2d 74 6f 20 66 61       [fail-to fa
7c80: 69 6c 2d 6b 5d 29 0a 20 20 20 20 20 20 20 20 20  il-k]).         
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c 65 74      (syntax (let
7cb0: 20 28 5b 62 69 6e 64 69 6e 67 20 28 6d 61 74 63   ([binding (matc
7cc0: 68 2d 78 6d 6c 2d 61 74 74 72 69 62 75 74 65 20  h-xml-attribute 
7cd0: 27 61 74 61 67 20 61 78 29 5d 29 0a 20 20 20 20  'atag ax)]).    
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 28 69 66 20 62 69 6e 64 69 6e 67 0a 20     (if binding. 
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 65            (if (e
7d40: 71 75 61 6c 3f 20 28 63 61 64 72 20 62 69 6e 64  qual? (cadr bind
7d50: 69 6e 67 29 20 6c 69 74 65 72 61 6c 29 0a 20 20  ing) literal).  
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 64               bod
7d90: 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 28 66 61 69 6c 2d 74 6f 29 29 0a 20 20 20 20   (fail-to)).    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 20 20 20 20 20 20 28 66 61 69 6c 2d 74 6f 29         (fail-to)
7e00: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 6e 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20  new-pvar-lst.   
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74 61          new-cata
7e50: 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20  -defs.          
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73   new-dotted-vars
7e80: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
7e90: 20 20 20 20 5b 28 29 0a 20 20 20 20 20 20 20 20      [().        
7ea0: 20 20 20 20 20 20 20 20 20 28 63 6f 6d 70 69 6c           (compil
7eb0: 65 2d 69 74 65 6d 2d 6c 69 73 74 20 62 6f 64 79  e-item-list body
7ec0: 2d 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  -lst.           
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 20 20 62 6f 64 79 2d 65 78           body-ex
7ef0: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 6e 65 78 74 70 0a 20 20 20 20        nextp.    
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20 20  fail-k.         
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 23 74 0a 20 20             #t.  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20    pvar-lst.     
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
7fc0: 65 70 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  epth.           
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75           cata-fu
7ff0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8010: 20 20 20 20 20 20 63 61 74 61 2d 64 65 66 73 0a        cata-defs.
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 64 6f 74 74 65 64 2d 76 61 72 73 29      dotted-vars)
8050: 5d 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ]))].           
8060: 5b 63 6f 6d 70 69 6c 65 2d 69 74 65 6d 2d 6c 69  [compile-item-li
8070: 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  st.            (
8080: 6c 61 6d 62 64 61 20 28 6c 73 74 20 65 78 70 20  lambda (lst exp 
8090: 6e 65 78 74 70 20 66 61 69 6c 2d 6b 20 65 6c 6c  nextp fail-k ell
80a0: 69 70 73 69 73 2d 61 6c 6c 6f 77 65 64 3f 20 70  ipsis-allowed? p
80b0: 76 61 72 2d 6c 73 74 20 64 65 70 74 68 20 63 61  var-lst depth ca
80c0: 74 61 2d 66 75 6e 20 63 61 74 61 2d 64 65 66 73  ta-fun cata-defs
80d0: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20   dotted-vars).  
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
80f0: 74 61 78 2d 63 61 73 65 20 6c 73 74 20 28 75 6e  tax-case lst (un
8100: 71 75 6f 74 65 20 2d 3e 29 0a 20 20 20 20 20 20  quote ->).      
8110: 20 20 20 20 20 20 20 20 20 20 5b 28 29 20 28 63            [() (c
8120: 6f 6d 70 69 6c 65 2d 65 6e 64 2d 65 6c 65 6d 65  ompile-end-eleme
8130: 6e 74 20 65 78 70 20 6e 65 78 74 70 20 66 61 69  nt exp nextp fai
8140: 6c 2d 6b 20 70 76 61 72 2d 6c 73 74 20 63 61 74  l-k pvar-lst cat
8150: 61 2d 64 65 66 73 20 64 6f 74 74 65 64 2d 76 61  a-defs dotted-va
8160: 72 73 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  rs)].           
8170: 20 20 20 20 20 5b 28 75 6e 71 75 6f 74 65 20 76       [(unquote v
8180: 61 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar).            
8190: 20 20 20 20 20 28 69 64 65 6e 74 69 66 69 65 72       (identifier
81a0: 3f 20 28 73 79 6e 74 61 78 20 76 61 72 29 29 0a  ? (syntax var)).
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 28 69 66 20 28 6e 6f 74 20 65 6c 6c 69 70 73   (if (not ellips
81d0: 69 73 2d 61 6c 6c 6f 77 65 64 3f 29 0a 20 20 20  is-allowed?).   
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 20 20 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 73 79    (sxml-match-sy
8200: 6e 74 61 78 2d 65 72 72 6f 72 20 22 69 6d 70 72  ntax-error "impr
8210: 6f 70 65 72 20 6c 69 73 74 20 70 61 74 74 65 72  oper list patter
8220: 6e 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  n not allowed in
8230: 20 74 68 69 73 20 63 6f 6e 74 65 78 74 22 0a 20   this context". 
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 78               stx
8270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
82a0: 73 79 6e 74 61 78 20 64 6f 74 73 29 29 0a 20 20  syntax dots)).  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28     (let-values (
82d0: 5b 28 6e 65 78 74 2d 74 65 73 74 73 20 6e 65 77  [(next-tests new
82e0: 2d 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61  -pvar-lst new-ca
82f0: 74 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74  ta-defs new-dott
8300: 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20  ed-vars).       
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 65 78              (nex
8330: 74 70 20 28 61 64 64 2d 70 61 74 2d 76 61 72 20  tp (add-pat-var 
8340: 28 73 79 6e 74 61 78 20 76 61 72 29 20 70 76 61  (syntax var) pva
8350: 72 2d 6c 73 74 29 20 63 61 74 61 2d 64 65 66 73  r-lst) cata-defs
8360: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a   dotted-vars)]).
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 20 20 20 28 76 61 6c 75 65 73 20 28         (values (
8390: 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 78 20  with-syntax ([x 
83a0: 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20  exp].           
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 5b 62 6f 64 79 20 6e 65 78 74 2d 74 65 73    [body next-tes
83e0: 74 73 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  ts]).           
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c        (syntax (l
8410: 65 74 20 28 5b 76 61 72 20 78 5d 29 20 62 6f 64  et ([var x]) bod
8420: 79 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  y))).           
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74      new-pvar-lst
8450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20  new-cata-defs.  
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
84a0: 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 29 29 5d  -dotted-vars)))]
84b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
84c0: 20 5b 28 75 6e 71 75 6f 74 65 20 5b 63 61 74 61   [(unquote [cata
84d0: 20 2d 3e 20 63 76 61 72 20 2e 2e 2e 5d 29 0a 20   -> cvar ...]). 
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 28 69 66 20 28 6e 6f 74 20 65 6c 6c 69 70 73 69  (if (not ellipsi
8500: 73 2d 61 6c 6c 6f 77 65 64 3f 29 0a 20 20 20 20  s-allowed?).    
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 73 79 6e   (sxml-match-syn
8530: 74 61 78 2d 65 72 72 6f 72 20 22 69 6d 70 72 6f  tax-error "impro
8540: 70 65 72 20 6c 69 73 74 20 70 61 74 74 65 72 6e  per list pattern
8550: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
8560: 74 68 69 73 20 63 6f 6e 74 65 78 74 22 0a 20 20  this context".  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 78 0a              stx.
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
85d0: 79 6e 74 61 78 20 64 6f 74 73 29 29 0a 20 20 20  yntax dots)).   
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 28 6c 65 74 20 28 5b 63 74 65 6d 70 20 28    (let ([ctemp (
8600: 63 61 72 20 28 67 65 6e 65 72 61 74 65 2d 74 65  car (generate-te
8610: 6d 70 6f 72 61 72 69 65 73 20 28 73 79 6e 74 61  mporaries (synta
8620: 78 20 28 5b 63 76 61 72 20 2e 2e 2e 5d 29 29 29  x ([cvar ...])))
8630: 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]).            
8640: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 2d             (let-
8650: 76 61 6c 75 65 73 20 28 5b 28 6e 65 78 74 2d 74  values ([(next-t
8660: 65 73 74 73 20 6e 65 77 2d 70 76 61 72 2d 6c 73  ests new-pvar-ls
8670: 74 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 20  t new-cata-defs 
8680: 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  new-dotted-vars)
8690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 28 6e 65 78 74 70 20 28 61 64        (nextp (ad
86c0: 64 2d 70 61 74 2d 76 61 72 20 63 74 65 6d 70 20  d-pat-var ctemp 
86d0: 70 76 61 72 2d 6c 73 74 29 0a 20 20 20 20 20 20  pvar-lst).      
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 20 20 20 20 20 20 28 61 64 64 2d 63 61 74 61 2d        (add-cata-
8710: 64 65 66 20 64 65 70 74 68 0a 20 20 20 20 20 20  def depth.      
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 28 73 79 6e 74 61 78 20 5b 63 76 61      (syntax [cva
8760: 72 20 2e 2e 2e 5d 29 0a 20 20 20 20 20 20 20 20  r ...]).        
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 28 73 79 6e 74 61 78 20 63 61 74 61 29 0a    (syntax cata).
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 20 20 20 20 20 20 20 63 74 65 6d 70 0a            ctemp.
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 64            cata-d
8830: 65 66 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  efs).           
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a   dotted-vars)]).
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73           (values
8890: 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20 28 5b   (with-syntax ([
88a0: 63 74 20 63 74 65 6d 70 5d 0a 20 20 20 20 20 20  ct ctemp].      
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 20 20 20 20 20 20 20 20 5b 78 20 65 78 70 5d           [x exp]
88e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 5b 62 6f 64 79 20 6e 65 78 74 2d 74 65 73 74 73  [body next-tests
8920: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c        (syntax (l
8950: 65 74 20 28 5b 63 74 20 78 5d 29 20 62 6f 64 79  et ([ct x]) body
8960: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73       new-pvar-ls
8990: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73     new-cata-defs
89c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89e0: 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72    new-dotted-var
89f0: 73 29 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20  s))))].         
8a00: 20 20 20 20 20 20 20 5b 28 75 6e 71 75 6f 74 65         [(unquote
8a10: 20 5b 63 76 61 72 20 2e 2e 2e 5d 29 0a 20 20 20   [cvar ...]).   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
8a30: 65 74 20 28 5b 63 74 65 6d 70 20 28 63 61 72 20  et ([ctemp (car 
8a40: 28 67 65 6e 65 72 61 74 65 2d 74 65 6d 70 6f 72  (generate-tempor
8a50: 61 72 69 65 73 20 28 73 79 6e 74 61 78 20 28 5b  aries (syntax ([
8a60: 63 76 61 72 20 2e 2e 2e 5d 29 29 29 29 5d 29 0a  cvar ...]))))]).
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 28 69 66 20 28 6e 6f 74 20 63 61 74 61     (if (not cata
8a90: 2d 66 75 6e 29 0a 20 20 20 20 20 20 20 20 20 20  -fun).          
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 78               (sx
8ab0: 6d 6c 2d 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d  ml-match-syntax-
8ac0: 65 72 72 6f 72 20 22 73 78 6d 6c 2d 6d 61 74 63  error "sxml-matc
8ad0: 68 20 70 61 74 74 65 72 6e 3a 20 63 61 74 61 6d  h pattern: catam
8ae0: 6f 72 70 68 69 73 6d 20 6e 6f 74 20 61 6c 6c 6f  orphism not allo
8af0: 77 65 64 20 69 6e 20 74 68 69 73 20 63 6f 6e 74  wed in this cont
8b00: 65 78 74 22 0a 20 20 20 20 20 20 20 20 20 20 20  ext".           
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 73 74 78 0a 20 20 20 20 20 20 20       stx.       
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
8b70: 20 5b 63 76 61 72 20 2e 2e 2e 5d 29 29 29 0a 20   [cvar ...]))). 
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 5b    (let-values ([
8ba0: 28 6e 65 78 74 2d 74 65 73 74 73 20 6e 65 77 2d  (next-tests new-
8bb0: 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74  pvar-lst new-cat
8bc0: 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74 65  a-defs new-dotte
8bd0: 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20  d-vars).        
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 28 6e 65 78 74 70 20           (nextp 
8c00: 28 61 64 64 2d 70 61 74 2d 76 61 72 20 63 74 65  (add-pat-var cte
8c10: 6d 70 20 70 76 61 72 2d 6c 73 74 29 0a 20 20 20  mp pvar-lst).   
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 20 20 28 61 64 64 2d 63 61 74 61 2d 64       (add-cata-d
8c50: 65 66 20 64 65 70 74 68 0a 20 20 20 20 20 20 20  ef depth.       
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8c90: 73 79 6e 74 61 78 20 5b 63 76 61 72 20 2e 2e 2e  syntax [cvar ...
8ca0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75           cata-fu
8ce0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 20 20 20 20 20 20 20 20 63 74 65 6d 70 0a 20 20          ctemp.  
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 20 63 61 74 61 2d 64 65 66 73 29 0a 20      cata-defs). 
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 20 20 20 64 6f 74 74 65 64 2d 76 61         dotted-va
8d90: 72 73 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20  rs)]).          
8da0: 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c 75             (valu
8db0: 65 73 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20  es (with-syntax 
8dc0: 28 5b 63 74 20 63 74 65 6d 70 5d 0a 20 20 20 20  ([ct ctemp].    
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 20 20 20 20 20 20 5b 78 20 65 78 70 5d 0a 20         [x exp]. 
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 5b 62 6f 64 79 20            [body 
8e30: 6e 65 78 74 2d 74 65 73 74 73 5d 29 0a 20 20 20  next-tests]).   
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
8e60: 74 61 78 20 28 6c 65 74 20 28 5b 63 74 20 78 5d  tax (let ([ct x]
8e70: 29 20 62 6f 64 79 29 29 29 0a 20 20 20 20 20 20  ) body))).      
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 20 20 6e 65 77 2d 70 76 61 72 2d         new-pvar-
8ea0: 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  lst.            
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 0a 20   new-cata-defs. 
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d              new-
8ef0: 64 6f 74 74 65 64 2d 76 61 72 73 29 29 29 5d 0a  dotted-vars)))].
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 5b 28 69 74 65 6d 20 64 6f 74 73 20 2e 20 72 73  [(item dots . rs
8f20: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
8f30: 20 20 20 20 28 65 6c 6c 69 70 73 69 73 3f 20 28      (ellipsis? (
8f40: 73 79 6e 74 61 78 20 64 6f 74 73 29 29 0a 20 20  syntax dots)).  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8f60: 69 66 20 28 6e 6f 74 20 65 6c 6c 69 70 73 69 73  if (not ellipsis
8f70: 2d 61 6c 6c 6f 77 65 64 3f 29 0a 20 20 20 20 20  -allowed?).     
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 73 79 6e 74  (sxml-match-synt
8fa0: 61 78 2d 65 72 72 6f 72 20 22 65 6c 6c 69 70 73  ax-error "ellips
8fb0: 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  es not allowed i
8fc0: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 22 0a  n this context".
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
9000: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 28 73 79 6e 74 61 78 20 64 6f 74 73 29 29 0a 20  (syntax dots)). 
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 64 6f 74      (compile-dot
9060: 74 65 64 2d 70 61 74 74 65 72 6e 2d 6c 69 73 74  ted-pattern-list
9070: 20 28 73 79 6e 74 61 78 20 69 74 65 6d 29 0a 20   (syntax item). 
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 28 73 79 6e 74 61 78 20 72 73 74 29 0a 20 20   (syntax rst).  
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 65 78 70 0a 20 20 20 20 20 20 20 20 20 20 20 20  exp.            
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 20 20 20 20 6e 65 78 74 70 0a 20 20 20 20        nextp.    
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
9160: 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20 20 20 20  il-k.           
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 20 20 20 20 70 76 61 72 2d 6c 73 74 0a         pvar-lst.
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 64 65 70 74 68 0a 20 20 20 20 20 20 20 20    depth.        
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 66            cata-f
9210: 75 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  un.             
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 63 61 74 61 2d 64 65 66 73 0a 20       cata-defs. 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 29 5d 0a   dotted-vars))].
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 5b 28 69 74 65 6d 20 2e 20 72 73 74 29 0a 20 20  [(item . rst).  
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
92c0: 63 6f 6d 70 69 6c 65 2d 69 74 65 6d 20 28 73 79  compile-item (sy
92d0: 6e 74 61 78 20 69 74 65 6d 29 0a 20 20 20 20 20  ntax item).     
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 20 20 20 20 20 65 78 70 0a 20 20            exp.  
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61               (la
9320: 6d 62 64 61 20 28 6e 65 77 2d 65 78 70 20 6e 65  mbda (new-exp ne
9330: 77 2d 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63  w-pvar-lst new-c
9340: 61 74 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74  ata-defs new-dot
9350: 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20  ted-vars).      
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6d 70             (comp
9380: 69 6c 65 2d 69 74 65 6d 2d 6c 69 73 74 20 28 73  ile-item-list (s
9390: 79 6e 74 61 78 20 72 73 74 29 0a 20 20 20 20 20  yntax rst).     
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
93d0: 65 77 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20  ew-exp.         
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 70             nextp
9410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20       fail-k.    
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 65 6c 6c 69 70 73 69 73 2d 61 6c 6c 6f 77 65 64  ellipsis-allowed
9490: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 20 20 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c        new-pvar-l
94d0: 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 20 20 20 20 20 64 65 70 74 68 0a 20 20 20         depth.   
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20 20   cata-fun.      
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
9580: 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20  w-cata-defs.    
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  new-dotted-vars)
95d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20   fail-k.        
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 20 20 20 20 70 76 61 72 2d 6c 73 74 0a         pvar-lst.
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
9640: 65 70 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  epth.           
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 20 63 61 74 61 2d 66 75 6e 0a 20 20 20      cata-fun.   
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 61              cata
9690: 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20  -defs.          
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 20 20 20 20 64 6f 74 74 65 64 2d 76 61 72 73       dotted-vars
96c0: 29 5d 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  )]))].          
96d0: 20 5b 63 6f 6d 70 69 6c 65 2d 64 6f 74 74 65 64   [compile-dotted
96e0: 2d 70 61 74 74 65 72 6e 2d 6c 69 73 74 0a 20 20  -pattern-list.  
96f0: 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64            (lambd
9700: 61 20 28 69 74 65 6d 0a 20 20 20 20 20 20 20 20  a (item.        
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 69               tai
9720: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
9730: 20 20 20 20 20 20 20 65 78 70 0a 20 20 20 20 20         exp.     
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 6e 65 78 74 70 0a 20 20 20 20 20 20 20 20 20 20  nextp.          
9760: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 2d             fail-
9770: 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k.              
9780: 20 20 20 20 20 20 20 70 76 61 72 2d 6c 73 74 0a         pvar-lst.
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 20 20 64 65 70 74 68 0a 20 20 20 20 20       depth.     
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20 20 20  cata-fun.       
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
97e0: 74 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20  ta-defs.        
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 74               dot
9800: 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20  ted-vars).      
9810: 20 20 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c          (let-val
9820: 75 65 73 20 28 5b 28 74 61 69 6c 2d 74 65 73 74  ues ([(tail-test
9830: 73 20 74 61 69 6c 2d 70 76 61 72 2d 6c 73 74 20  s tail-pvar-lst 
9840: 74 61 69 6c 2d 63 61 74 61 2d 64 65 66 73 20 74  tail-cata-defs t
9850: 61 69 6c 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  ail-dotted-vars)
9860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
9880: 6d 70 69 6c 65 2d 69 74 65 6d 2d 6c 69 73 74 20  mpile-item-list 
9890: 74 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  tail.           
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 28 73 79 6e 74 61 78 20 6c 73 74 29      (syntax lst)
98d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 28 6c 61 6d 62 64 61 20 28 6e 65 77 2d 70 76 61  (lambda (new-pva
9910: 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d 64  r-lst new-cata-d
9920: 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76  efs new-dotted-v
9930: 61 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ars).           
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 20 20 20 28 76 61 6c 75 65 73 20 28 77        (values (w
9970: 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 28 6e 70  ith-syntax ([(np
9980: 76 20 2e 2e 2e 29 20 6e 65 77 2d 70 76 61 72 2d  v ...) new-pvar-
9990: 6c 73 74 5d 29 0a 20 20 20 20 20 20 20 20 20 20  lst]).          
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 28 73 79 6e 74 61 78 20 28 76 61 6c 75 65 73   (syntax (values
99e0: 20 23 74 20 6e 70 76 20 2e 2e 2e 29 29 29 0a 20   #t npv ...))). 
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 20 20 20 20 20 6e 65 77 2d 70 76 61 72          new-pvar
9a30: 2d 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  -lst.           
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
9a70: 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20  w-cata-defs.    
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d       new-dotted-
9ac0: 76 61 72 73 29 29 0a 20 20 20 20 20 20 20 20 20  vars)).         
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 66 61        (syntax fa
9b00: 69 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  il).            
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 23 66 0a 20 20 20 20 20 20 20 20 20 20     #f.          
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 20       '().       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 20 20 20 64 65 70 74 68 0a 20 20          depth.  
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 27 28 29               '()
9bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 27 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  '().            
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 64 6f 74 74 65 64 2d 76 61 72 73 29 5d     dotted-vars)]
9c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 69 74              [(it
9c60: 65 6d 2d 74 65 73 74 73 20 69 74 65 6d 2d 70 76  em-tests item-pv
9c70: 61 72 2d 6c 73 74 20 69 74 65 6d 2d 63 61 74 61  ar-lst item-cata
9c80: 2d 64 65 66 73 20 69 74 65 6d 2d 64 6f 74 74 65  -defs item-dotte
9c90: 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20  d-vars).        
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 69 74 65      (compile-ite
9cc0: 6d 20 69 74 65 6d 0a 20 20 20 20 20 20 20 20 20  m item.         
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 28 73 79 6e 74 61 78 20 6c 73 74 29 0a 20 20   (syntax lst).  
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20          (lambda 
9d30: 28 6e 65 77 2d 65 78 70 20 6e 65 77 2d 70 76 61  (new-exp new-pva
9d40: 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d 64  r-lst new-cata-d
9d50: 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76  efs new-dotted-v
9d60: 61 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ars).           
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73   (values (with-s
9da0: 79 6e 74 61 78 20 28 5b 28 6e 70 76 20 2e 2e 2e  yntax ([(npv ...
9db0: 29 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 5d 29  ) new-pvar-lst])
9dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28         (syntax (
9e00: 76 61 6c 75 65 73 20 23 74 20 28 63 64 72 20 6c  values #t (cdr l
9e10: 73 74 29 20 6e 70 76 20 2e 2e 2e 29 29 29 0a 20  st) npv ...))). 
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 0a     new-pvar-lst.
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 20 20 6e 65 77 2d 63 61 74 61 2d 64 65 66      new-cata-def
9ea0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64        new-dotted
9ee0: 2d 76 61 72 73 29 29 0a 20 20 20 20 20 20 20 20  -vars)).        
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 20 28 73 79 6e 74 61 78 20 66 61 69 6c 29 0a    (syntax fail).
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 20 20 20 20 27 28 29 0a 20 20            '().  
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 20 20 20 20 20 20 28 2b 20 31 20 64 65 70          (+ 1 dep
9f80: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  th).            
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
9fb0: 74 61 2d 66 75 6e 0a 20 20 20 20 20 20 20 20 20  ta-fun.         
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 27 28 29 0a 20 20 20 20 20 20 20 20 20 20 20   '().           
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
a010: 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a 20 20  otted-vars)]).  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20                ; 
a030: 6d 6f 72 65 20 68 65 72 65 3a 20 63 68 65 63 6b  more here: check
a040: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 70   for duplicate p
a050: 61 74 2d 76 61 72 73 2c 20 63 61 74 61 2d 64 65  at-vars, cata-de
a060: 66 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  fs.             
a070: 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28     (let-values (
a080: 5b 28 66 69 6e 61 6c 2d 74 65 73 74 73 20 66 69  [(final-tests fi
a090: 6e 61 6c 2d 70 76 61 72 2d 6c 73 74 20 66 69 6e  nal-pvar-lst fin
a0a0: 61 6c 2d 63 61 74 61 2d 64 65 66 73 20 66 69 6e  al-cata-defs fin
a0b0: 61 6c 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 0a  al-dotted-vars).
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
a0e0: 65 78 74 70 20 28 61 70 70 65 6e 64 20 74 61 69  extp (append tai
a0f0: 6c 2d 70 76 61 72 2d 6c 73 74 20 69 74 65 6d 2d  l-pvar-lst item-
a100: 70 76 61 72 2d 6c 73 74 20 70 76 61 72 2d 6c 73  pvar-lst pvar-ls
a110: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 28 61 70 70 65 6e 64 20          (append 
a140: 74 61 69 6c 2d 63 61 74 61 2d 64 65 66 73 20 69  tail-cata-defs i
a150: 74 65 6d 2d 63 61 74 61 2d 64 65 66 73 20 63 61  tem-cata-defs ca
a160: 74 61 2d 64 65 66 73 29 0a 20 20 20 20 20 20 20  ta-defs).       
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61                (a
a190: 70 70 65 6e 64 20 69 74 65 6d 2d 70 76 61 72 2d  ppend item-pvar-
a1a0: 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  lst.            
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 28 63 61 74 61 2d 64 65 66 73 2d 3e 70 76 61   (cata-defs->pva
a1e0: 72 2d 6c 73 74 20 69 74 65 6d 2d 63 61 74 61 2d  r-lst item-cata-
a1f0: 64 65 66 73 29 0a 20 20 20 20 20 20 20 20 20 20  defs).          
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 20 74 61 69 6c 2d 64 6f 74 74 65 64 2d 76     tail-dotted-v
a230: 61 72 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ars.            
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 64 6f 74 74 65 64 2d 76 61 72 73 29 29 5d 29   dotted-vars))])
a270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a280: 20 20 20 28 6c 65 74 20 28 5b 74 65 6d 70 2d 69     (let ([temp-i
a290: 74 65 6d 2d 70 76 61 72 2d 6c 73 74 20 28 67 65  tem-pvar-lst (ge
a2a0: 6e 65 72 61 74 65 2d 74 65 6d 70 6f 72 61 72 69  nerate-temporari
a2b0: 65 73 20 69 74 65 6d 2d 70 76 61 72 2d 6c 73 74  es item-pvar-lst
a2c0: 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]).            
a2d0: 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 73 0a          (values.
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 20 20 28 77 69 74 68 2d 73 79 6e 74 61       (with-synta
a300: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
a310: 20 20 20 20 20 20 20 20 20 20 20 28 5b 78 20 65             ([x e
a320: 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp].            
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
a340: 61 69 6c 2d 74 6f 20 66 61 69 6c 2d 6b 5d 0a 20  ail-to fail-k]. 
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 20 20 20 20 5b 74 61 69 6c 2d 62           [tail-b
a370: 6f 64 79 20 74 61 69 6c 2d 74 65 73 74 73 5d 0a  ody tail-tests].
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 20 20 20 20 20 20 5b 69 74 65 6d 2d            [item-
a3a0: 62 6f 64 79 20 69 74 65 6d 2d 74 65 73 74 73 5d  body item-tests]
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a3c0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6e 61             [fina
a3d0: 6c 2d 62 6f 64 79 20 66 69 6e 61 6c 2d 74 65 73  l-body final-tes
a3e0: 74 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts].            
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 28                [(
a400: 69 70 76 20 2e 2e 2e 29 20 69 74 65 6d 2d 70 76  ipv ...) item-pv
a410: 61 72 2d 6c 73 74 5d 0a 20 20 20 20 20 20 20 20  ar-lst].        
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 5b 28 67 70 76 20 2e 2e 2e 29 20 74 65 6d    [(gpv ...) tem
a440: 70 2d 69 74 65 6d 2d 70 76 61 72 2d 6c 73 74 5d  p-item-pvar-lst]
a450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a460: 20 20 20 20 20 20 20 20 20 20 20 5b 28 74 70 76             [(tpv
a470: 20 2e 2e 2e 29 20 74 61 69 6c 2d 70 76 61 72 2d   ...) tail-pvar-
a480: 6c 73 74 5d 0a 20 20 20 20 20 20 20 20 20 20 20  lst].           
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
a4a0: 28 69 74 65 6d 2d 76 6f 69 64 20 2e 2e 2e 29 20  (item-void ...) 
a4b0: 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 69 29  (map (lambda (i)
a4c0: 20 28 73 79 6e 74 61 78 20 28 76 6f 69 64 29 29   (syntax (void))
a4d0: 29 20 69 74 65 6d 2d 70 76 61 72 2d 6c 73 74 29  ) item-pvar-lst)
a4e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 74 61              [(ta
a500: 69 6c 2d 76 6f 69 64 20 2e 2e 2e 29 20 28 6d 61  il-void ...) (ma
a510: 70 20 28 6c 61 6d 62 64 61 20 28 69 29 20 28 73  p (lambda (i) (s
a520: 79 6e 74 61 78 20 28 76 6f 69 64 29 29 29 20 74  yntax (void))) t
a530: 61 69 6c 2d 70 76 61 72 2d 6c 73 74 29 5d 0a 20  ail-pvar-lst)]. 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 5b 28 69 74 65 6d 2d           [(item-
a560: 6e 75 6c 6c 20 2e 2e 2e 29 20 28 6d 61 70 20 28  null ...) (map (
a570: 6c 61 6d 62 64 61 20 28 69 29 20 28 73 79 6e 74  lambda (i) (synt
a580: 61 78 20 27 28 29 29 29 20 69 74 65 6d 2d 70 76  ax '())) item-pv
a590: 61 72 2d 6c 73 74 29 5d 0a 20 20 20 20 20 20 20  ar-lst)].       
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 5b 28 69 74 65 6d 2d 63 6f 6e 73 20 2e     [(item-cons .
a5c0: 2e 2e 29 20 28 6d 61 70 20 28 6c 61 6d 62 64 61  ..) (map (lambda
a5d0: 20 28 61 20 62 29 0a 20 20 20 20 20 20 20 20 20   (a b).         
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 20 20 20 20 20 20 20 28 77 69 74 68 2d 73           (with-s
a610: 79 6e 74 61 78 20 28 5b 78 61 20 61 5d 0a 20 20  yntax ([xa a].  
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 78                [x
a660: 62 20 62 5d 29 0a 20 20 20 20 20 20 20 20 20 20  b b]).          
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
a6a0: 78 20 28 63 6f 6e 73 20 78 61 20 78 62 29 29 29  x (cons xa xb)))
a6b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 69 74 65 6d 2d 70 76 61 72 2d 6c 73 74 0a    item-pvar-lst.
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 74 65 6d 70 2d 69 74 65 6d 2d 70 76 61 72 2d 6c  temp-item-pvar-l
a730: 73 74 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20  st)]).          
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79               (sy
a750: 6e 74 61 78 20 28 6c 65 74 72 65 63 20 28 5b 6d  ntax (letrec ([m
a760: 61 74 63 68 2d 74 61 69 6c 0a 20 20 20 20 20 20  atch-tail.      
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 28 6c 61 6d 62 64 61 20 28 6c 73 74 20     (lambda (lst 
a7a0: 66 61 69 6c 29 0a 20 20 20 20 20 20 20 20 20 20  fail).          
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 74 61 69 6c 2d 62 6f 64 79 29 5d 0a 20 20 20   tail-body)].   
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 5b 6d 61 74 63 68 2d 69 74 65 6d       [match-item
a810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62 64            (lambd
a840: 61 20 28 6c 73 74 29 0a 20 20 20 20 20 20 20 20  a (lst).        
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 28 6c 65 74 20 28 5b 66 61 69 6c 20 28     (let ([fail (
a880: 6c 61 6d 62 64 61 20 28 29 0a 20 20 20 20 20 20  lambda ().      
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 28 76 61 6c 75 65 73 20 23 66 0a 20 20     (values #f.  
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
a910: 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 69 74 65 6d 2d 76 6f 69 64 20 2e 2e      item-void ..
a960: 2e 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20  .))]).          
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 20 20 20 69 74 65 6d 2d 62 6f 64 79 29 29 5d 0a     item-body))].
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 5b 6d 61 74 63 68 2d 64          [match-d
a9d0: 6f 74 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  otted.          
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
aa00: 6c 61 6d 62 64 61 20 28 78 29 0a 20 20 20 20 20  lambda (x).     
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65        (let-value
aa40: 73 20 28 5b 28 74 61 69 6c 2d 72 65 73 20 74 70  s ([(tail-res tp
aa50: 76 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 20  v ...).         
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 28 6d 61 74 63 68 2d 74 61 69 6c 20 78 0a 20 20  (match-tail x.  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 20 20     (lambda ().  
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 28 76 61 6c 75 65 73 20 23 66 0a       (values #f.
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ab90: 61 69 6c 2d 76 6f 69 64 20 2e 2e 2e 29 29 29 5d  ail-void ...)))]
aba0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
abd0: 69 66 20 74 61 69 6c 2d 72 65 73 0a 20 20 20 20  if tail-res.    
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 61               (va
ac10: 6c 75 65 73 20 69 74 65 6d 2d 6e 75 6c 6c 20 2e  lues item-null .
ac20: 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 76 20              tpv 
ac60: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 20 20 20  ...).           
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65        (let-value
aca0: 73 20 28 5b 28 72 65 73 20 6e 65 77 2d 78 20 69  s ([(res new-x i
acb0: 70 76 20 2e 2e 2e 29 20 28 6d 61 74 63 68 2d 69  pv ...) (match-i
acc0: 74 65 6d 20 78 29 5d 29 0a 20 20 20 20 20 20 20  tem x)]).       
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20              (if 
ad00: 72 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  res.            
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 2d             (let-
ad40: 76 61 6c 75 65 73 20 28 5b 28 67 70 76 20 2e 2e  values ([(gpv ..
ad50: 2e 20 74 70 76 20 2e 2e 2e 29 0a 20 20 20 20 20  . tpv ...).     
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 28 6d 61 74 63 68 2d 64 6f 74 74 65 64 20 6e 65  (match-dotted ne
adb0: 77 2d 78 29 5d 29 0a 20 20 20 20 20 20 20 20 20  w-x)]).         
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 28 76 61 6c 75 65 73 20 69 74 65 6d 2d 63 6f 6e  (values item-con
ae00: 73 20 2e 2e 2e 20 74 70 76 20 2e 2e 2e 29 29 0a  s ... tpv ...)).
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75         (let-valu
ae50: 65 73 20 28 5b 28 6c 61 73 74 2d 74 61 69 6c 2d  es ([(last-tail-
ae60: 72 65 73 20 74 70 76 20 2e 2e 2e 29 0a 20 20 20  res tpv ...).   
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 28 6d 61 74 63 68 2d 74 61 69 6c 20 78 20    (match-tail x 
aec0: 66 61 69 6c 2d 74 6f 29 5d 29 0a 20 20 20 20 20  fail-to)]).     
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 28 76 61 6c 75 65 73 20 69 74 65 6d      (values item
af10: 2d 6e 75 6c 6c 20 2e 2e 2e 20 74 70 76 20 2e 2e  -null ... tpv ..
af20: 2e 29 29 29 29 29 29 29 5d 29 0a 20 20 20 20 20  .)))))))]).     
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74              (let
af50: 2d 76 61 6c 75 65 73 20 28 5b 28 69 70 76 20 2e  -values ([(ipv .
af60: 2e 2e 20 74 70 76 20 2e 2e 2e 29 0a 20 20 20 20  .. tpv ...).    
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 20 20 20 20 20 20 20 20 20 28 6d 61 74 63             (matc
afa0: 68 2d 64 6f 74 74 65 64 20 78 29 5d 29 0a 20 20  h-dotted x)]).  
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 66 69 6e 61 6c 2d 62 6f 64 79 29 29 29 29 0a   final-body)))).
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 66 69 6e 61 6c 2d 70 76 61 72 2d       final-pvar-
b000: 6c 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  lst.            
b010: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 2d 63           final-c
b020: 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20  ata-defs.       
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
b040: 6e 61 6c 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  nal-dotted-vars)
b050: 29 29 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  ))))].          
b060: 20 5b 63 6f 6d 70 69 6c 65 2d 69 74 65 6d 0a 20   [compile-item. 
b070: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 6d 62             (lamb
b080: 64 61 20 28 69 74 65 6d 20 65 78 70 20 6e 65 78  da (item exp nex
b090: 74 70 20 66 61 69 6c 2d 6b 20 70 76 61 72 2d 6c  tp fail-k pvar-l
b0a0: 73 74 20 64 65 70 74 68 20 63 61 74 61 2d 66 75  st depth cata-fu
b0b0: 6e 20 63 61 74 61 2d 64 65 66 73 20 64 6f 74 74  n cata-defs dott
b0c0: 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20  ed-vars).       
b0d0: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63         (syntax-c
b0e0: 61 73 65 20 69 74 65 6d 20 28 75 6e 71 75 6f 74  ase item (unquot
b0f0: 65 20 2d 3e 29 0a 20 20 20 20 20 20 20 20 20 20  e ->).          
b100: 20 20 20 20 20 20 3b 20 6e 6f 72 6d 61 6c 20 70        ; normal p
b110: 61 74 74 65 72 6e 20 76 61 72 0a 20 20 20 20 20  attern var.     
b120: 20 20 20 20 20 20 20 20 20 20 20 5b 28 75 6e 71             [(unq
b130: 75 6f 74 65 20 76 61 72 29 0a 20 20 20 20 20 20  uote var).      
b140: 20 20 20 20 20 20 20 20 20 20 20 28 69 64 65 6e             (iden
b150: 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78 20  tifier? (syntax 
b160: 76 61 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  var)).          
b170: 20 20 20 20 20 20 20 28 6c 65 74 20 28 5b 6e 65         (let ([ne
b180: 77 2d 65 78 70 20 28 63 61 72 20 28 67 65 6e 65  w-exp (car (gene
b190: 72 61 74 65 2d 74 65 6d 70 6f 72 61 72 69 65 73  rate-temporaries
b1a0: 20 28 6c 69 73 74 20 65 78 70 29 29 29 5d 29 0a   (list exp)))]).
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28     (let-values (
b1d0: 5b 28 6e 65 78 74 2d 74 65 73 74 73 20 6e 65 77  [(next-tests new
b1e0: 2d 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61  -pvar-lst new-ca
b1f0: 74 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74  ta-defs new-dott
b200: 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20  ed-vars).       
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 20 20 20 20 28 6e 65 78 74 70            (nextp
b230: 20 6e 65 77 2d 65 78 70 20 28 61 64 64 2d 70 61   new-exp (add-pa
b240: 74 2d 76 61 72 20 28 73 79 6e 74 61 78 20 76 61  t-var (syntax va
b250: 72 29 20 70 76 61 72 2d 6c 73 74 29 20 63 61 74  r) pvar-lst) cat
b260: 61 2d 64 65 66 73 20 64 6f 74 74 65 64 2d 76 61  a-defs dotted-va
b270: 72 73 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20  rs)]).          
b280: 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c 75             (valu
b290: 65 73 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20  es (with-syntax 
b2a0: 28 5b 78 20 65 78 70 5d 0a 20 20 20 20 20 20 20  ([x exp].       
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 5b 6e 78 20 6e 65 77 2d 65 78 70 5d      [nx new-exp]
b2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 20 20 20 20 20 20 20 20 5b 62 6f 64              [bod
b310: 79 20 6e 65 78 74 2d 74 65 73 74 73 5d 0a 20 20  y next-tests].  
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 20 20 20 20 20 20 5b 66 61 69 6c 2d 74           [fail-t
b350: 6f 20 66 61 69 6c 2d 6b 5d 29 0a 20 20 20 20 20  o fail-k]).     
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
b380: 78 20 28 69 66 20 28 70 61 69 72 3f 20 78 29 0a  x (if (pair? x).
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20             (let 
b3c0: 28 5b 6e 78 20 28 63 64 72 20 78 29 5d 0a 20 20  ([nx (cdr x)].  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
b400: 76 61 72 20 28 63 61 72 20 78 29 5d 29 0a 20 20  var (car x)]).  
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 20 20 20 20 20 20 20 62 6f 64 79 29             body)
b440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 61 69              (fai
b470: 6c 2d 74 6f 29 29 29 29 0a 20 20 20 20 20 20 20  l-to)))).       
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c        new-pvar-l
b4a0: 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20  new-cata-defs.  
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 64             new-d
b4f0: 6f 74 74 65 64 2d 76 61 72 73 29 29 29 5d 0a 20  otted-vars)))]. 
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b                 ;
b510: 20 6e 61 6d 65 64 20 63 61 74 61 6d 6f 72 70 68   named catamorph
b520: 69 73 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ism.            
b530: 20 20 20 20 5b 28 75 6e 71 75 6f 74 65 20 5b 63      [(unquote [c
b540: 61 74 61 20 2d 3e 20 63 76 61 72 20 2e 2e 2e 5d  ata -> cvar ...]
b550: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
b560: 20 20 20 28 6c 65 74 20 28 5b 6e 65 77 2d 65 78     (let ([new-ex
b570: 70 20 28 63 61 72 20 28 67 65 6e 65 72 61 74 65  p (car (generate
b580: 2d 74 65 6d 70 6f 72 61 72 69 65 73 20 28 6c 69  -temporaries (li
b590: 73 74 20 65 78 70 29 29 29 5d 0a 20 20 20 20 20  st exp)))].     
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 5b 63 74 65 6d 70 20 28 63 61 72 20 28 67    [ctemp (car (g
b5c0: 65 6e 65 72 61 74 65 2d 74 65 6d 70 6f 72 61 72  enerate-temporar
b5d0: 69 65 73 20 28 73 79 6e 74 61 78 20 28 5b 63 76  ies (syntax ([cv
b5e0: 61 72 20 2e 2e 2e 5d 29 29 29 29 5d 29 0a 20 20  ar ...]))))]).  
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 5b 28   (let-values ([(
b610: 6e 65 78 74 2d 74 65 73 74 73 20 6e 65 77 2d 70  next-tests new-p
b620: 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61  var-lst new-cata
b630: 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64  -defs new-dotted
b640: 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20 20  -vars).         
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 20 20 20 20 28 6e 65 78 74 70 20 6e          (nextp n
b670: 65 77 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20  ew-exp.         
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b6a0: 61 64 64 2d 70 61 74 2d 76 61 72 20 63 74 65 6d  add-pat-var ctem
b6b0: 70 20 70 76 61 72 2d 6c 73 74 29 0a 20 20 20 20  p pvar-lst).    
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 20 20 28 61 64 64 2d 63 61 74 61 2d 64 65      (add-cata-de
b6f0: 66 20 64 65 70 74 68 0a 20 20 20 20 20 20 20 20  f depth.        
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
b730: 79 6e 74 61 78 20 5b 63 76 61 72 20 2e 2e 2e 5d  yntax [cvar ...]
b740: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b770: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
b780: 63 61 74 61 29 0a 20 20 20 20 20 20 20 20 20 20  cata).          
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 74 65 6d              ctem
b7c0: 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p.              
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 20 63 61 74 61 2d 64 65 66          cata-def
b800: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 20 20 20 20 20 20 20 20 20 20 20 64 6f 74 74 65             dotte
b830: 64 2d 76 61 72 73 29 5d 29 0a 20 20 20 20 20 20  d-vars)]).      
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b850: 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73 79 6e  values (with-syn
b860: 74 61 78 20 28 5b 78 20 65 78 70 5d 0a 20 20 20  tax ([x exp].   
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 20 20 20 20 5b 6e 78 20 6e 65 77 2d          [nx new-
b8a0: 65 78 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20  exp].           
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 5b 63 74 20 63 74 65 6d 70 5d 0a 20 20 20 20 20  [ct ctemp].     
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 20 5b 62 6f 64 79 20 6e 65 78 74        [body next
b910: 2d 74 65 73 74 73 5d 0a 20 20 20 20 20 20 20 20  -tests].        
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 5b 66 61 69 6c 2d 74 6f 20 66 61 69 6c     [fail-to fail
b950: 2d 6b 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  -k]).           
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 28 73 79 6e 74 61 78 20 28 69 66 20      (syntax (if 
b980: 28 70 61 69 72 3f 20 78 29 0a 20 20 20 20 20 20  (pair? x).      
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 20 20 20 28 6c 65 74 20 28 5b 6e 78 20 28       (let ([nx (
b9c0: 63 64 72 20 78 29 5d 0a 20 20 20 20 20 20 20 20  cdr x)].        
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 5b 63 74 20 28 63 61           [ct (ca
ba00: 72 20 78 29 5d 29 0a 20 20 20 20 20 20 20 20 20  r x)]).         
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 62 6f 64 79 29 0a 20 20 20 20 20 20      body).      
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 28 66 61 69 6c 2d 74 6f 29 29 29       (fail-to)))
ba70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ba90: 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20  ew-pvar-lst.    
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74           new-cat
bac0: 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20  a-defs.         
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76      new-dotted-v
baf0: 61 72 73 29 29 29 5d 0a 20 20 20 20 20 20 20 20  ars)))].        
bb00: 20 20 20 20 20 20 20 20 3b 20 62 61 73 69 63 20          ; basic 
bb10: 63 61 74 61 6d 6f 72 70 68 69 73 6d 0a 20 20 20  catamorphism.   
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 75               [(u
bb30: 6e 71 75 6f 74 65 20 5b 63 76 61 72 20 2e 2e 2e  nquote [cvar ...
bb40: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
bb50: 20 20 20 20 28 6c 65 74 20 28 5b 6e 65 77 2d 65      (let ([new-e
bb60: 78 70 20 28 63 61 72 20 28 67 65 6e 65 72 61 74  xp (car (generat
bb70: 65 2d 74 65 6d 70 6f 72 61 72 69 65 73 20 28 6c  e-temporaries (l
bb80: 69 73 74 20 65 78 70 29 29 29 5d 0a 20 20 20 20  ist exp)))].    
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 20 20 20 5b 63 74 65 6d 70 20 28 63 61 72 20 28     [ctemp (car (
bbb0: 67 65 6e 65 72 61 74 65 2d 74 65 6d 70 6f 72 61  generate-tempora
bbc0: 72 69 65 73 20 28 73 79 6e 74 61 78 20 28 5b 63  ries (syntax ([c
bbd0: 76 61 72 20 2e 2e 2e 5d 29 29 29 29 5d 29 0a 20  var ...]))))]). 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 28 69 66 20 28 6e 6f 74 20 63 61 74 61 2d    (if (not cata-
bc00: 66 75 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  fun).           
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 78 6d              (sxm
bc20: 6c 2d 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d 65  l-match-syntax-e
bc30: 72 72 6f 72 20 22 73 78 6d 6c 2d 6d 61 74 63 68  rror "sxml-match
bc40: 20 70 61 74 74 65 72 6e 3a 20 63 61 74 61 6d 6f   pattern: catamo
bc50: 72 70 68 69 73 6d 20 6e 6f 74 20 61 6c 6c 6f 77  rphism not allow
bc60: 65 64 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65  ed in this conte
bc70: 78 74 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt".            
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 73 74 78 0a 20 20 20 20 20 20 20 20      stx.        
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
bce0: 5b 63 76 61 72 20 2e 2e 2e 5d 29 29 29 0a 20 20  [cvar ...]))).  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 5b 28   (let-values ([(
bd10: 6e 65 78 74 2d 74 65 73 74 73 20 6e 65 77 2d 70  next-tests new-p
bd20: 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61  var-lst new-cata
bd30: 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74 65 64  -defs new-dotted
bd40: 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20 20  -vars).         
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 20 20 20 28 6e 65 78 74 70 20 6e          (nextp n
bd70: 65 77 2d 65 78 70 0a 20 20 20 20 20 20 20 20 20  ew-exp.         
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
bda0: 61 64 64 2d 70 61 74 2d 76 61 72 20 63 74 65 6d  add-pat-var ctem
bdb0: 70 20 70 76 61 72 2d 6c 73 74 29 0a 20 20 20 20  p pvar-lst).    
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 20 28 61 64 64 2d 63 61 74 61 2d 64 65      (add-cata-de
bdf0: 66 20 64 65 70 74 68 0a 20 20 20 20 20 20 20 20  f depth.        
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
be30: 79 6e 74 61 78 20 5b 63 76 61 72 20 2e 2e 2e 5d  yntax [cvar ...]
be40: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75 6e          cata-fun
be80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 20 20 63 74 65 6d 70 0a 20 20 20         ctemp.   
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 20 20 20 63 61 74 61 2d 64 65 66 73 29 0a 20 20     cata-defs).  
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 64 6f 74 74 65 64 2d 76 61 72        dotted-var
bf30: 73 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  s)]).           
bf40: 20 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65            (value
bf50: 73 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20 28  s (with-syntax (
bf60: 5b 78 20 65 78 70 5d 0a 20 20 20 20 20 20 20 20  [x exp].        
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 5b 6e 78 20 6e 65 77 2d 65 78 70 5d 0a     [nx new-exp].
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 5b 63 74 20 63             [ct c
bfd0: 74 65 6d 70 5d 0a 20 20 20 20 20 20 20 20 20 20  temp].          
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 5b 62 6f 64 79 20 6e 65 78 74 2d 74 65 73 74   [body next-test
c010: 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s].             
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
c040: 61 69 6c 2d 74 6f 20 66 61 69 6c 2d 6b 5d 29 0a  ail-to fail-k]).
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
c070: 73 79 6e 74 61 78 20 28 69 66 20 28 70 61 69 72  syntax (if (pair
c080: 3f 20 78 29 0a 20 20 20 20 20 20 20 20 20 20 20  ? x).           
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 28 6c 65 74 20 28 5b 6e 78 20 28 63 64 72 20 78  (let ([nx (cdr x
c0c0: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )].             
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 5b 63 74 20 28 63 61 72 20 78 29 5d      [ct (car x)]
c100: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
c130: 6f 64 79 29 0a 20 20 20 20 20 20 20 20 20 20 20  ody).           
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 28 66 61 69 6c 2d 74 6f 29 29 29 29 0a 20 20 20  (fail-to)))).   
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 70 76            new-pv
c190: 61 72 2d 6c 73 74 0a 20 20 20 20 20 20 20 20 20  ar-lst.         
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 6e 65 77 2d 63 61 74 61 2d 64 65 66      new-cata-def
c1c0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
c1e0: 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 29  ew-dotted-vars))
c1f0: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )].             
c200: 20 20 20 5b 28 74 61 67 20 69 74 65 6d 20 2e 2e     [(tag item ..
c210: 2e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  .).             
c220: 20 20 20 20 28 69 64 65 6e 74 69 66 69 65 72 3f      (identifier?
c230: 20 28 73 79 6e 74 61 78 20 74 61 67 29 29 0a 20   (syntax tag)). 
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 28 6c 65 74 20 28 5b 6e 65 77 2d 65 78 70 20 28  (let ([new-exp (
c260: 63 61 72 20 28 67 65 6e 65 72 61 74 65 2d 74 65  car (generate-te
c270: 6d 70 6f 72 61 72 69 65 73 20 28 6c 69 73 74 20  mporaries (list 
c280: 65 78 70 29 29 29 5d 29 0a 20 20 20 20 20 20 20  exp)))]).       
c290: 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74              (let
c2a0: 2d 76 61 6c 75 65 73 20 28 5b 28 61 66 74 65 72  -values ([(after
c2b0: 2d 74 65 73 74 73 20 61 66 74 65 72 2d 70 76 61  -tests after-pva
c2c0: 72 2d 6c 73 74 20 61 66 74 65 72 2d 63 61 74 61  r-lst after-cata
c2d0: 2d 64 65 66 73 20 61 66 74 65 72 2d 64 6f 74 74  -defs after-dott
c2e0: 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20  ed-vars).       
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6d 70 69            (compi
c310: 6c 65 2d 65 6c 65 6d 65 6e 74 2d 70 61 74 20 28  le-element-pat (
c320: 73 79 6e 74 61 78 20 28 74 61 67 20 69 74 65 6d  syntax (tag item
c330: 20 2e 2e 2e 29 29 0a 20 20 20 20 20 20 20 20 20   ...)).         
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 77 69               (wi
c370: 74 68 2d 73 79 6e 74 61 78 20 28 5b 78 20 65 78  th-syntax ([x ex
c380: 70 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p]).            
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e              (syn
c3c0: 74 61 78 20 28 63 61 72 20 78 29 29 29 0a 20 20  tax (car x))).  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6d 6f 72      (lambda (mor
c410: 65 2d 70 76 61 72 2d 6c 73 74 20 6d 6f 72 65 2d  e-pvar-lst more-
c420: 63 61 74 61 2d 64 65 66 73 20 6d 6f 72 65 2d 64  cata-defs more-d
c430: 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20  otted-vars).    
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20      (let-values 
c480: 28 5b 28 6e 65 78 74 2d 74 65 73 74 73 20 6e 65  ([(next-tests ne
c490: 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20  w-pvar-lst.     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
c4f0: 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20  -cata-defs.     
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
c550: 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20  -dotted-vars).  
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 28 6e 65 78 74 70 20 6e 65 77 2d 65      (nextp new-e
c5b0: 78 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  xp.             
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 6d 6f 72 65 2d 70 76 61 72 2d 6c 73 74 0a 20 20  more-pvar-lst.  
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 20 20 20 20 20 6d 6f 72 65 2d             more-
c660: 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20 20  cata-defs.      
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 20 20 6d 6f 72 65 2d 64 6f 74 74         more-dott
c6c0: 65 64 2d 76 61 72 73 29 5d 29 0a 20 20 20 20 20  ed-vars)]).     
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 20 28 76 61 6c 75 65 73 20 28 77 69       (values (wi
c710: 74 68 2d 73 79 6e 74 61 78 20 28 5b 78 20 65 78  th-syntax ([x ex
c720: 70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p].             
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 5b 6e 78 20 6e 65 77 2d 65 78 70 5d 0a     [nx new-exp].
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 5b 62 6f 64 79 20 6e 65 78 74 2d 74 65 73 74 73  [body next-tests
c7e0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28         (syntax (
c830: 6c 65 74 20 28 5b 6e 78 20 28 63 64 72 20 78 29  let ([nx (cdr x)
c840: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 62 6f 64 79 29 29 29 0a 20 20 20 20 20 20 20   body))).       
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 70             new-p
c8e0: 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20 20 20  var-lst.        
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61            new-ca
c930: 74 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20  ta-defs.        
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2d 64 6f            new-do
c980: 74 74 65 64 2d 76 61 72 73 29 29 29 0a 20 20 20  tted-vars))).   
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20     fail-k.      
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20 20 20  pvar-lst.       
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
ca40: 65 70 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  epth.           
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d             cata-
ca80: 66 75 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  fun.            
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 20 20 20 20 20 63 61 74 61 2d 64            cata-d
cac0: 65 66 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  efs.            
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 20 20 20 20 20 20 64 6f 74 74 65 64            dotted
cb00: 2d 76 61 72 73 29 5d 29 0a 20 20 20 20 20 20 20  -vars)]).       
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20                ; 
cb20: 74 65 73 74 20 74 68 61 74 20 77 65 20 61 72 65  test that we are
cb30: 20 6e 6f 74 20 61 74 20 74 68 65 20 65 6e 64 20   not at the end 
cb40: 6f 66 20 61 6e 20 69 74 65 6d 2d 6c 69 73 74 2c  of an item-list,
cb50: 20 42 45 46 4f 52 45 0a 20 20 20 20 20 20 20 20   BEFORE.        
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 65               ; e
cb70: 6e 74 65 72 69 6e 67 20 74 65 73 74 73 20 66 6f  ntering tests fo
cb80: 72 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 70 61  r the element pa
cb90: 74 74 65 72 6e 20 28 61 67 61 69 6e 73 74 20 74  ttern (against t
cba0: 68 65 20 27 63 61 72 27 20 6f 66 20 74 68 65 20  he 'car' of the 
cbb0: 69 74 65 6d 2d 6c 69 73 74 29 0a 20 20 20 20 20  item-list).     
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 28 76 61 6c 75 65 73 20 28 77 69 74 68 2d 73 79  (values (with-sy
cbe0: 6e 74 61 78 20 28 5b 78 20 65 78 70 5d 0a 20 20  ntax ([x exp].  
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 20 20 20 20 20 20 20 20 5b 62 6f 64 79 20 61           [body a
cc20: 66 74 65 72 2d 74 65 73 74 73 5d 0a 20 20 20 20  fter-tests].    
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 20 20 5b 66 61 69 6c 2d 74 6f 20         [fail-to 
cc60: 66 61 69 6c 2d 6b 5d 29 0a 20 20 20 20 20 20 20  fail-k]).       
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
cc90: 28 69 66 20 28 70 61 69 72 3f 20 78 29 0a 20 20  (if (pair? x).  
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 20 20 20 20 20 20 20 20 20 62 6f 64 79 0a 20 20           body.  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 20 20 20 20 28 66 61 69 6c 2d 74           (fail-t
cd00: 6f 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  o)))).          
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 61 66 74 65 72 2d 70 76 61 72 2d 6c 73     after-pvar-ls
cd30: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
cd50: 66 74 65 72 2d 63 61 74 61 2d 64 65 66 73 0a 20  fter-cata-defs. 
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
cd80: 72 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 29 29  r-dotted-vars)))
cd90: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
cda0: 20 20 5b 28 69 20 2e 2e 2e 29 0a 20 20 20 20 20    [(i ...).     
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 78 6d              (sxm
cdc0: 6c 2d 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d 65  l-match-syntax-e
cdd0: 72 72 6f 72 20 22 62 61 64 20 70 61 74 74 65 72  rror "bad patter
cde0: 6e 20 73 79 6e 74 61 78 20 28 6e 6f 74 20 61 6e  n syntax (not an
cdf0: 20 65 6c 65 6d 65 6e 74 20 70 61 74 74 65 72 6e   element pattern
ce00: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 78               stx
ce30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74             (synt
ce60: 61 78 20 28 69 20 2e 2e 2e 29 29 29 5d 0a 20 20  ax (i ...)))].  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69                [i
ce80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce90: 20 20 28 69 64 65 6e 74 69 66 69 65 72 3f 20 28    (identifier? (
cea0: 73 79 6e 74 61 78 20 69 29 29 0a 20 20 20 20 20  syntax i)).     
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 78 6d              (sxm
cec0: 6c 2d 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d 65  l-match-syntax-e
ced0: 72 72 6f 72 20 22 62 61 64 20 70 61 74 74 65 72  rror "bad patter
cee0: 6e 20 73 79 6e 74 61 78 20 28 73 79 6d 62 6f 6c  n syntax (symbol
cef0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
cf00: 74 68 69 73 20 63 6f 6e 74 65 78 74 29 22 0a 20  this context)". 
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 20 20 20 20 20 73 74 78 0a 20 20 20           stx.   
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 69         (syntax i
cf70: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
cf80: 20 20 20 20 5b 6c 69 74 65 72 61 6c 0a 20 20 20      [literal.   
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
cfa0: 69 74 65 72 61 6c 3f 20 28 73 79 6e 74 61 78 20  iteral? (syntax 
cfb0: 6c 69 74 65 72 61 6c 29 29 0a 20 20 20 20 20 20  literal)).      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20             (let 
cfd0: 28 5b 6e 65 77 2d 65 78 70 20 28 63 61 72 20 28  ([new-exp (car (
cfe0: 67 65 6e 65 72 61 74 65 2d 74 65 6d 70 6f 72 61  generate-tempora
cff0: 72 69 65 73 20 28 6c 69 73 74 20 65 78 70 29 29  ries (list exp))
d000: 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]).            
d010: 20 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75         (let-valu
d020: 65 73 20 28 5b 28 6e 65 78 74 2d 74 65 73 74 73  es ([(next-tests
d030: 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74 20 6e 65   new-pvar-lst ne
d040: 77 2d 63 61 74 61 2d 64 65 66 73 20 6e 65 77 2d  w-cata-defs new-
d050: 64 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20 20  dotted-vars).   
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
d080: 65 78 74 70 20 6e 65 77 2d 65 78 70 20 70 76 61  extp new-exp pva
d090: 72 2d 6c 73 74 20 63 61 74 61 2d 64 65 66 73 20  r-lst cata-defs 
d0a0: 64 6f 74 74 65 64 2d 76 61 72 73 29 5d 29 0a 20  dotted-vars)]). 
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 28 76 61 6c 75 65 73 20 28 77 69 74      (values (wit
d0d0: 68 2d 73 79 6e 74 61 78 20 28 5b 78 20 65 78 70  h-syntax ([x exp
d0e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6e 78               [nx
d110: 20 6e 65 77 2d 65 78 70 5d 0a 20 20 20 20 20 20   new-exp].      
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 20 5b 62 6f 64 79 20 6e 65 78 74 2d       [body next-
d150: 74 65 73 74 73 5d 0a 20 20 20 20 20 20 20 20 20  tests].         
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 5b 66 61 69 6c 2d 74 6f 20 66 61 69 6c 2d    [fail-to fail-
d190: 6b 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  k]).            
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 28 73 79 6e 74 61 78 20 28 69 66 20 28     (syntax (if (
d1c0: 61 6e 64 20 28 70 61 69 72 3f 20 78 29 20 28 65  and (pair? x) (e
d1d0: 71 75 61 6c 3f 20 6c 69 74 65 72 61 6c 20 28 63  qual? literal (c
d1e0: 61 72 20 78 29 29 29 0a 20 20 20 20 20 20 20 20  ar x))).        
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 28 6c 65 74 20 28 5b 6e 78 20 28 63 64     (let ([nx (cd
d220: 72 20 78 29 5d 29 0a 20 20 20 20 20 20 20 20 20  r x)]).         
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 20 20 62 6f 64 79 29 0a 20 20 20 20 20 20      body).      
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 28 66 61 69 6c 2d 74 6f 29 29 29       (fail-to)))
d290: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d2b0: 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20  ew-pvar-lst.    
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74           new-cat
d2e0: 61 2d 64 65 66 73 0a 20 20 20 20 20 20 20 20 20  a-defs.         
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76      new-dotted-v
d310: 61 72 73 29 29 29 5d 29 29 5d 29 0a 20 20 20 20  ars)))]))]).    
d320: 20 20 20 20 28 6c 65 74 20 28 5b 66 61 69 6c 2d      (let ([fail-
d330: 6b 20 28 73 79 6e 74 61 78 20 66 61 69 6c 75 72  k (syntax failur
d340: 65 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 28  e)]).          (
d350: 73 79 6e 74 61 78 2d 63 61 73 65 20 73 74 78 20  syntax-case stx 
d360: 28 75 6e 71 75 6f 74 65 20 67 75 61 72 64 20 2d  (unquote guard -
d370: 3e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  >).            [
d380: 28 63 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20  (compile-clause 
d390: 28 28 75 6e 71 75 6f 74 65 20 76 61 72 29 20 28  ((unquote var) (
d3a0: 67 75 61 72 64 20 67 65 78 70 20 2e 2e 2e 29 20  guard gexp ...) 
d3b0: 61 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20 2e  action0 action .
d3c0: 2e 2e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ..).            
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 65 78 70 0a 20 20 20 20 20 20 20 20 20 20 20   exp.           
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20    cata-fun.     
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 20 66 61 69 6c 2d 65 78 70          fail-exp
d430: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
d440: 69 64 65 6e 74 69 66 69 65 72 3f 20 28 73 79 6e  identifier? (syn
d450: 74 61 78 20 76 61 72 29 29 0a 20 20 20 20 20 20  tax var)).      
d460: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28         (syntax (
d470: 6c 65 74 20 28 5b 76 61 72 20 65 78 70 5d 29 0a  let ([var exp]).
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 20 28 69 66 20 28 61 6e 64 20         (if (and 
d4a0: 67 65 78 70 20 2e 2e 2e 29 0a 20 20 20 20 20 20  gexp ...).      
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 28 62 65 67 69 6e 20 61 63 74 69       (begin acti
d4d0: 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 0a  on0 action ...).
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 20 20 20 20 20 20 20 28 66 61 69 6c             (fail
d500: 2d 65 78 70 29 29 29 29 5d 0a 20 20 20 20 20 20  -exp))))].      
d510: 20 20 20 20 20 20 5b 28 63 6f 6d 70 69 6c 65 2d        [(compile-
d520: 63 6c 61 75 73 65 20 28 28 75 6e 71 75 6f 74 65  clause ((unquote
d530: 20 5b 63 61 74 61 20 2d 3e 20 63 76 61 72 20 2e   [cata -> cvar .
d540: 2e 2e 5d 29 20 28 67 75 61 72 64 20 67 65 78 70  ..]) (guard gexp
d550: 20 2e 2e 2e 29 20 61 63 74 69 6f 6e 30 20 61 63   ...) action0 ac
d560: 74 69 6f 6e 20 2e 2e 2e 29 0a 20 20 20 20 20 20  tion ...).      
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 65 78 70 0a 20 20 20 20 20         exp.     
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 20 63 61 74 61 2d 66 75 6e          cata-fun
d5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
d5d0: 69 6c 2d 65 78 70 29 0a 20 20 20 20 20 20 20 20  il-exp).        
d5e0: 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 69 66       (syntax (if
d5f0: 20 28 61 6e 64 20 67 65 78 70 20 2e 2e 2e 29 0a   (and gexp ...).
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 28 6c 65 74 2d 76 61           (let-va
d620: 6c 75 65 73 20 28 5b 28 63 76 61 72 20 2e 2e 2e  lues ([(cvar ...
d630: 29 20 28 63 61 74 61 20 65 78 70 29 5d 29 0a 20  ) (cata exp)]). 
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 20 20 20 28 62 65 67 69 6e            (begin
d660: 20 61 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20   action0 action 
d670: 2e 2e 2e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ...)).          
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d690: 66 61 69 6c 2d 65 78 70 29 29 29 5d 0a 20 20 20  fail-exp)))].   
d6a0: 20 20 20 20 20 20 20 20 20 5b 28 63 6f 6d 70 69           [(compi
d6b0: 6c 65 2d 63 6c 61 75 73 65 20 28 28 75 6e 71 75  le-clause ((unqu
d6c0: 6f 74 65 20 5b 63 76 61 72 20 2e 2e 2e 5d 29 20  ote [cvar ...]) 
d6d0: 28 67 75 61 72 64 20 67 65 78 70 20 2e 2e 2e 29  (guard gexp ...)
d6e0: 20 61 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20   action0 action 
d6f0: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 20 20 20  ...).           
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 20 20 65 78 70 0a 20 20 20 20 20 20 20 20 20 20    exp.          
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d730: 20 20 20 63 61 74 61 2d 66 75 6e 0a 20 20 20 20     cata-fun.    
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 66 61 69 6c 2d 65 78           fail-ex
d760: 70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p).             
d770: 28 69 66 20 28 6e 6f 74 20 28 65 78 74 72 61 63  (if (not (extrac
d780: 74 2d 63 61 74 61 2d 66 75 6e 20 28 73 79 6e 74  t-cata-fun (synt
d790: 61 78 20 63 61 74 61 2d 66 75 6e 29 29 29 0a 20  ax cata-fun))). 
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 73 79 6e 74  (sxml-match-synt
d7c0: 61 78 2d 65 72 72 6f 72 20 22 73 78 6d 6c 2d 6d  ax-error "sxml-m
d7d0: 61 74 63 68 20 70 61 74 74 65 72 6e 3a 20 63 61  atch pattern: ca
d7e0: 74 61 6d 6f 72 70 68 69 73 6d 20 6e 6f 74 20 61  tamorphism not a
d7f0: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 69 73 20 63  llowed in this c
d800: 6f 6e 74 65 78 74 22 0a 20 20 20 20 20 20 20 20  ontext".        
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 73 74 78 0a 20 20 20 20 20 20 20 20 20 20    stx.          
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 28 73 79 6e 74 61 78 20 5b 63 76 61 72 20 2e 2e  (syntax [cvar ..
d870: 2e 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  .])).           
d880: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 69        (syntax (i
d890: 66 20 28 61 6e 64 20 67 65 78 70 20 2e 2e 2e 29  f (and gexp ...)
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
d8c0: 65 74 2d 76 61 6c 75 65 73 20 28 5b 28 63 76 61  et-values ([(cva
d8d0: 72 20 2e 2e 2e 29 20 28 63 61 74 61 2d 66 75 6e  r ...) (cata-fun
d8e0: 20 65 78 70 29 5d 29 0a 20 20 20 20 20 20 20 20   exp)]).        
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 28 62 65 67 69 6e 20 61 63         (begin ac
d910: 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e  tion0 action ...
d920: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 28 66 61 69 6c 2d 65 78 70 29 29 29 29 5d 0a 20  (fail-exp))))]. 
d950: 20 20 20 20 20 20 20 20 20 20 20 5b 28 63 6f 6d             [(com
d960: 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 28 75 6e  pile-clause ((un
d970: 71 75 6f 74 65 20 76 61 72 29 20 61 63 74 69 6f  quote var) actio
d980: 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 20 65  n0 action ...) e
d990: 78 70 20 63 61 74 61 2d 66 75 6e 20 66 61 69 6c  xp cata-fun fail
d9a0: 2d 65 78 70 29 0a 20 20 20 20 20 20 20 20 20 20  -exp).          
d9b0: 20 20 20 28 69 64 65 6e 74 69 66 69 65 72 3f 20     (identifier? 
d9c0: 28 73 79 6e 74 61 78 20 76 61 72 29 29 0a 20 20  (syntax var)).  
d9d0: 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74             (synt
d9e0: 61 78 20 28 6c 65 74 20 28 5b 76 61 72 20 65 78  ax (let ([var ex
d9f0: 70 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p]).            
da00: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f             actio
da10: 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 29 5d  n0 action ...))]
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 63  .            [(c
da30: 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 28  ompile-clause ((
da40: 75 6e 71 75 6f 74 65 20 5b 63 61 74 61 20 2d 3e  unquote [cata ->
da50: 20 63 76 61 72 20 2e 2e 2e 5d 29 20 61 63 74 69   cvar ...]) acti
da60: 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 20  on0 action ...) 
da70: 65 78 70 20 63 61 74 61 2d 66 75 6e 20 66 61 69  exp cata-fun fai
da80: 6c 2d 65 78 70 29 0a 20 20 20 20 20 20 20 20 20  l-exp).         
da90: 20 20 20 20 28 73 79 6e 74 61 78 20 28 6c 65 74      (syntax (let
daa0: 2d 76 61 6c 75 65 73 20 28 5b 28 63 76 61 72 20  -values ([(cvar 
dab0: 2e 2e 2e 29 20 28 63 61 74 61 20 65 78 70 29 5d  ...) (cata exp)]
dac0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
dad0: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 30           action0
dae0: 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 29 5d 0a 20   action ...))]. 
daf0: 20 20 20 20 20 20 20 20 20 20 20 5b 28 63 6f 6d             [(com
db00: 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 28 75 6e  pile-clause ((un
db10: 71 75 6f 74 65 20 5b 63 76 61 72 20 2e 2e 2e 5d  quote [cvar ...]
db20: 29 20 61 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e  ) action0 action
db30: 20 2e 2e 2e 29 20 65 78 70 20 63 61 74 61 2d 66   ...) exp cata-f
db40: 75 6e 20 66 61 69 6c 2d 65 78 70 29 0a 20 20 20  un fail-exp).   
db50: 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 6e            (if (n
db60: 6f 74 20 28 65 78 74 72 61 63 74 2d 63 61 74 61  ot (extract-cata
db70: 2d 66 75 6e 20 28 73 79 6e 74 61 78 20 63 61 74  -fun (syntax cat
db80: 61 2d 66 75 6e 29 29 29 0a 20 20 20 20 20 20 20  a-fun))).       
db90: 20 20 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d            (sxml-
dba0: 6d 61 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72  match-syntax-err
dbb0: 6f 72 20 22 73 78 6d 6c 2d 6d 61 74 63 68 20 70  or "sxml-match p
dbc0: 61 74 74 65 72 6e 3a 20 63 61 74 61 6d 6f 72 70  attern: catamorp
dbd0: 68 69 73 6d 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  hism not allowed
dbe0: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
dbf0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 78 0a              stx.
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
dc50: 78 20 5b 63 76 61 72 20 2e 2e 2e 5d 29 29 0a 20  x [cvar ...])). 
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 28 73 79 6e 74 61 78 20 28 6c 65 74 2d 76 61 6c  (syntax (let-val
dc80: 75 65 73 20 28 5b 28 63 76 61 72 20 2e 2e 2e 29  ues ([(cvar ...)
dc90: 20 28 63 61 74 61 2d 66 75 6e 20 65 78 70 29 5d   (cata-fun exp)]
dca0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
dcc0: 69 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29  ion0 action ...)
dcd0: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
dce0: 5b 28 63 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65  [(compile-clause
dcf0: 20 28 28 6c 73 74 20 2e 20 72 73 74 29 20 28 67   ((lst . rst) (g
dd00: 75 61 72 64 20 67 65 78 70 20 2e 2e 2e 29 20 61  uard gexp ...) a
dd10: 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e  ction0 action ..
dd20: 2e 29 20 65 78 70 20 63 61 74 61 2d 66 75 6e 20  .) exp cata-fun 
dd30: 66 61 69 6c 2d 65 78 70 29 0a 20 20 20 20 20 20  fail-exp).      
dd40: 20 20 20 20 20 20 20 28 61 6e 64 20 28 69 64 65         (and (ide
dd50: 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78  ntifier? (syntax
dd60: 20 6c 73 74 29 29 20 28 65 71 3f 20 27 6c 69 73   lst)) (eq? 'lis
dd70: 74 20 28 73 79 6e 74 61 78 2d 6f 62 6a 65 63 74  t (syntax-object
dd80: 2d 3e 64 61 74 75 6d 20 28 73 79 6e 74 61 78 20  ->datum (syntax 
dd90: 6c 73 74 29 29 29 29 0a 20 20 20 20 20 20 20 20  lst)))).        
dda0: 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73       (let-values
ddb0: 20 28 5b 28 72 65 73 75 6c 74 20 70 76 61 72 2d   ([(result pvar-
ddc0: 6c 73 74 20 63 61 74 61 2d 64 65 66 73 20 64 6f  lst cata-defs do
ddd0: 74 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20  tted-vars).     
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 69        (compile-i
de00: 74 65 6d 2d 6c 69 73 74 20 28 73 79 6e 74 61 78  tem-list (syntax
de10: 20 72 73 74 29 0a 20 20 20 20 20 20 20 20 20 20   rst).          
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 28 73 79 6e 74 61 78 20 65 78 70 29      (syntax exp)
de50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
de80: 6c 61 6d 62 64 61 20 28 6e 65 77 2d 70 76 61 72  lambda (new-pvar
de90: 2d 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d 64 65  -lst new-cata-de
dea0: 66 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61  fs new-dotted-va
deb0: 72 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  rs).            
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 20 28 76 61 6c 75 65 73 0a 20 20 20 20      (values.    
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 77 69               (wi
df20: 74 68 2d 73 79 6e 74 61 78 0a 20 20 20 20 20 20  th-syntax.      
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
df60: 5b 65 78 70 2d 62 6f 64 79 20 28 70 72 6f 63 65  [exp-body (proce
df70: 73 73 2d 63 61 74 61 2d 64 65 66 73 20 6e 65 77  ss-cata-defs new
df80: 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20  -cata-defs.     
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
dfe0: 72 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d 61 63  rocess-output-ac
dff0: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
e050: 20 28 62 65 67 69 6e 20 61 63 74 69 6f 6e 30 0a   (begin action0.
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 29 0a     action ...)).
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76      new-dotted-v
e130: 61 72 73 29 29 5d 0a 20 20 20 20 20 20 20 20 20  ars))].         
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 61               [fa
e170: 69 6c 2d 74 6f 20 66 61 69 6c 2d 6b 5d 29 0a 20  il-to fail-k]). 
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 28 73 79 6e 74 61 78 20 28 69 66 20 28 61    (syntax (if (a
e1c0: 6e 64 20 67 65 78 70 20 2e 2e 2e 29 20 65 78 70  nd gexp ...) exp
e1d0: 2d 62 6f 64 79 20 28 66 61 69 6c 2d 74 6f 29 29  -body (fail-to))
e1e0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 6e 65 77 2d 70 76 61 72 2d 6c 73 74      new-pvar-lst
e220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73 0a    new-cata-defs.
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73   new-dotted-vars
e2a0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20   fail-k.        
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 23 74 0a 20 20 20 20 20 20 20        #t.       
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20         '().     
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 20 20 20 20 30 0a 20 20 20 20 20           0.     
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 20 20 20 20 20 20 20 28 65 78 74 72 61 63           (extrac
e3a0: 74 2d 63 61 74 61 2d 66 75 6e 20 28 73 79 6e 74  t-cata-fun (synt
e3b0: 61 78 20 63 61 74 61 2d 66 75 6e 29 29 0a 20 20  ax cata-fun)).  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 27 28 29 0a              '().
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 28                '(
e420: 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  ))]).           
e430: 20 20 20 20 28 77 69 74 68 2d 73 79 6e 74 61 78      (with-syntax
e440: 20 28 5b 66 61 69 6c 2d 74 6f 20 66 61 69 6c 2d   ([fail-to fail-
e450: 6b 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k].             
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 5b 62 6f 64 79 20 72 65 73 75 6c 74 5d 29 0a 20  [body result]). 
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 28 73 79 6e 74 61 78 20 28 6c 65 74 20 28 5b 66  (syntax (let ([f
e4a0: 61 69 6c 2d 74 6f 20 66 61 69 6c 2d 65 78 70 5d  ail-to fail-exp]
e4b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 66               (if
e4d0: 20 28 6e 6f 64 65 73 65 74 3f 20 65 78 70 29 0a   (nodeset? exp).
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
e500: 6f 64 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  ody.            
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 28 66 61 69 6c 2d 74 6f 29 29 29 29 29     (fail-to)))))
e530: 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  )].            [
e540: 28 63 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20  (compile-clause 
e550: 28 28 6c 73 74 20 2e 20 72 73 74 29 20 61 63 74  ((lst . rst) act
e560: 69 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29  ion0 action ...)
e570: 20 65 78 70 20 63 61 74 61 2d 66 75 6e 20 66 61   exp cata-fun fa
e580: 69 6c 2d 65 78 70 29 0a 20 20 20 20 20 20 20 20  il-exp).        
e590: 20 20 20 20 20 28 61 6e 64 20 28 69 64 65 6e 74       (and (ident
e5a0: 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78 20 6c  ifier? (syntax l
e5b0: 73 74 29 29 20 28 65 71 3f 20 27 6c 69 73 74 20  st)) (eq? 'list 
e5c0: 28 73 79 6e 74 61 78 2d 6f 62 6a 65 63 74 2d 3e  (syntax-object->
e5d0: 64 61 74 75 6d 20 28 73 79 6e 74 61 78 20 6c 73  datum (syntax ls
e5e0: 74 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  t)))).          
e5f0: 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28     (let-values (
e600: 5b 28 72 65 73 75 6c 74 20 70 76 61 72 2d 6c 73  [(result pvar-ls
e610: 74 20 63 61 74 61 2d 64 65 66 73 20 64 6f 74 74  t cata-defs dott
e620: 65 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20  ed-vars).       
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 69 74 65      (compile-ite
e650: 6d 2d 6c 69 73 74 20 28 73 79 6e 74 61 78 20 72  m-list (syntax r
e660: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 28 73 79 6e 74 61 78 20 65 78 70 29 0a 20    (syntax exp). 
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 61               (la
e6d0: 6d 62 64 61 20 28 6e 65 77 2d 70 76 61 72 2d 6c  mbda (new-pvar-l
e6e0: 73 74 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73  st new-cata-defs
e6f0: 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73   new-dotted-vars
e700: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 28 76 61 6c 75 65 73 20 28 70 72 6f 63 65    (values (proce
e740: 73 73 2d 63 61 74 61 2d 64 65 66 73 20 6e 65 77  ss-cata-defs new
e750: 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20 20  -cata-defs.     
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 20 20 28 70 72 6f 63 65 73 73 2d 6f        (process-o
e7b0: 75 74 70 75 74 2d 61 63 74 69 6f 6e 0a 20 20 20  utput-action.   
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
e810: 20 28 62 65 67 69 6e 20 61 63 74 69 6f 6e 30 0a   (begin action0.
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f             actio
e880: 6e 20 2e 2e 2e 29 29 0a 20 20 20 20 20 20 20 20  n ...)).        
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8d0: 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76      new-dotted-v
e8e0: 61 72 73 29 29 0a 20 20 20 20 20 20 20 20 20 20  ars)).          
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
e920: 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20 20  w-pvar-lst.     
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 6e 65 77 2d 63 61 74 61 2d 64 65 66 73     new-cata-defs
e970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 6e 65 77 2d 64 6f 74           new-dot
e9b0: 74 65 64 2d 76 61 72 73 29 29 0a 20 20 20 20 20  ted-vars)).     
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 20 66 61 69 6c 2d 6b 0a           fail-k.
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 74                #t
ea20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27                 '
ea50: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   0.             
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 28 65 78 74 72 61 63 74 2d 63 61 74 61 2d 66   (extract-cata-f
eac0: 75 6e 20 28 73 79 6e 74 61 78 20 63 61 74 61 2d  un (syntax cata-
ead0: 66 75 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  fun)).          
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 20 20      '().        
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 20 20 20 20 27 28 29 29 5d 29 0a 20 20 20        '())]).   
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 28 77 69 74              (wit
eb50: 68 2d 73 79 6e 74 61 78 20 28 5b 62 6f 64 79 20  h-syntax ([body 
eb60: 72 65 73 75 6c 74 5d 0a 20 20 20 20 20 20 20 20  result].        
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 20 20 20 5b 66 61 69 6c 2d 74 6f 20 66 61       [fail-to fa
eb90: 69 6c 2d 6b 5d 29 0a 20 20 20 20 20 20 20 20 20  il-k]).         
eba0: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20          (syntax 
ebb0: 28 6c 65 74 20 28 5b 66 61 69 6c 2d 74 6f 20 66  (let ([fail-to f
ebc0: 61 69 6c 2d 65 78 70 5d 29 0a 20 20 20 20 20 20  ail-exp]).      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 28 69 66 20 28 6e 6f 64 65 73 65       (if (nodese
ebf0: 74 3f 20 65 78 70 29 0a 20 20 20 20 20 20 20 20  t? exp).        
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 20 62 6f 64 79 0a 20 20 20 20         body.    
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 20 20 20 20 28 66 61 69 6c             (fail
ec40: 2d 74 6f 29 29 29 29 29 29 5d 0a 20 20 20 20 20  -to))))))].     
ec50: 20 20 20 20 20 20 20 5b 28 63 6f 6d 70 69 6c 65         [(compile
ec60: 2d 63 6c 61 75 73 65 20 28 28 66 73 74 20 2e 20  -clause ((fst . 
ec70: 72 73 74 29 20 28 67 75 61 72 64 20 67 65 78 70  rst) (guard gexp
ec80: 20 2e 2e 2e 29 20 61 63 74 69 6f 6e 30 20 61 63   ...) action0 ac
ec90: 74 69 6f 6e 20 2e 2e 2e 29 20 65 78 70 20 63 61  tion ...) exp ca
eca0: 74 61 2d 66 75 6e 20 66 61 69 6c 2d 65 78 70 29  ta-fun fail-exp)
ecb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69  .             (i
ecc0: 64 65 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74  dentifier? (synt
ecd0: 61 78 20 66 73 74 29 29 0a 20 20 20 20 20 20 20  ax fst)).       
ece0: 20 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65        (let-value
ecf0: 73 20 28 5b 28 72 65 73 75 6c 74 20 70 76 61 72  s ([(result pvar
ed00: 2d 6c 73 74 20 63 61 74 61 2d 64 65 66 73 20 64  -lst cata-defs d
ed10: 6f 74 74 65 64 2d 76 61 72 73 29 0a 20 20 20 20  otted-vars).    
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed30: 20 20 20 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d         (compile-
ed40: 65 6c 65 6d 65 6e 74 2d 70 61 74 20 28 73 79 6e  element-pat (syn
ed50: 74 61 78 20 28 66 73 74 20 2e 20 72 73 74 29 29  tax (fst . rst))
ed60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 28 73 79 6e 74 61 78 20 65 78 70 29 0a 20 20   (syntax exp).  
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c                (l
edd0: 61 6d 62 64 61 20 28 6e 65 77 2d 70 76 61 72 2d  ambda (new-pvar-
ede0: 6c 73 74 20 6e 65 77 2d 63 61 74 61 2d 64 65 66  lst new-cata-def
edf0: 73 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72  s new-dotted-var
ee00: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 28 76 61 6c 75 65 73 0a 20 20 20       (values.   
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 28 77 69 74 68 2d 73 79 6e 74 61 78 0a 20 20 20  (with-syntax.   
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 28 5b 62 6f 64 79 20 28 70 72 6f 63      ([body (proc
eec0: 65 73 73 2d 63 61 74 61 2d 64 65 66 73 20 6e 65  ess-cata-defs ne
eed0: 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20 20  w-cata-defs.    
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 72               (pr
ef30: 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d 61 63 74  ocess-output-act
ef40: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 62        (syntax (b
efa0: 65 67 69 6e 20 61 63 74 69 6f 6e 30 0a 20 20 20  egin action0.   
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
f010: 74 69 6f 6e 20 2e 2e 2e 29 29 0a 20 20 20 20 20  tion ...)).     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
f070: 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 29 5d 0a  -dotted-vars))].
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 20 20 20 20 20 20 5b 66 61 69 6c 2d 74 6f          [fail-to
f0c0: 20 66 61 69 6c 2d 6b 5d 29 0a 20 20 20 20 20 20   fail-k]).      
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f100: 73 79 6e 74 61 78 20 28 69 66 20 28 61 6e 64 20  syntax (if (and 
f110: 67 65 78 70 20 2e 2e 2e 29 20 62 6f 64 79 20 28  gexp ...) body (
f120: 66 61 69 6c 2d 74 6f 29 29 29 29 0a 20 20 20 20  fail-to)))).    
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
f160: 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20 20  ew-pvar-lst.    
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
f1a0: 65 77 2d 63 61 74 61 2d 64 65 66 73 0a 20 20 20  ew-cata-defs.   
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 6e 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29  new-dotted-vars)
f1f0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20    fail-k.       
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 20 20 20 20 20 20 20 20 27 28 29 0a 20 20 20           '().   
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 20               0. 
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f2c0: 65 78 74 72 61 63 74 2d 63 61 74 61 2d 66 75 6e  extract-cata-fun
f2d0: 20 28 73 79 6e 74 61 78 20 63 61 74 61 2d 66 75   (syntax cata-fu
f2e0: 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)).            
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 20 20      '().        
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 27 28 29 29 5d 29 0a 20          '())]). 
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 77                (w
f360: 69 74 68 2d 73 79 6e 74 61 78 20 28 5b 66 61 69  ith-syntax ([fai
f370: 6c 2d 74 6f 20 66 61 69 6c 2d 6b 5d 0a 20 20 20  l-to fail-k].   
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 20 20 20 20 20 20 20 20 5b 62 6f 64 79 20            [body 
f3a0: 72 65 73 75 6c 74 5d 29 0a 20 20 20 20 20 20 20  result]).       
f3b0: 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
f3c0: 78 20 28 6c 65 74 20 28 5b 66 61 69 6c 2d 74 6f  x (let ([fail-to
f3d0: 20 66 61 69 6c 2d 65 78 70 5d 29 0a 20 20 20 20   fail-exp]).    
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 62 6f 64 79 29 29 29 29 5d         body))))]
f400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 63  .            [(c
f410: 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 28  ompile-clause ((
f420: 66 73 74 20 2e 20 72 73 74 29 20 61 63 74 69 6f  fst . rst) actio
f430: 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 20 65  n0 action ...) e
f440: 78 70 20 63 61 74 61 2d 66 75 6e 20 66 61 69 6c  xp cata-fun fail
f450: 2d 65 78 70 29 0a 20 20 20 20 20 20 20 20 20 20  -exp).          
f460: 20 20 20 28 69 64 65 6e 74 69 66 69 65 72 3f 20     (identifier? 
f470: 28 73 79 6e 74 61 78 20 66 73 74 29 29 0a 20 20  (syntax fst)).  
f480: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 2d             (let-
f490: 76 61 6c 75 65 73 20 28 5b 28 72 65 73 75 6c 74  values ([(result
f4a0: 20 70 76 61 72 2d 6c 73 74 20 63 61 74 61 2d 64   pvar-lst cata-d
f4b0: 65 66 73 20 64 6f 74 74 65 64 2d 76 61 72 73 29  efs dotted-vars)
f4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6d              (com
f4e0: 70 69 6c 65 2d 65 6c 65 6d 65 6e 74 2d 70 61 74  pile-element-pat
f4f0: 20 28 73 79 6e 74 61 78 20 28 66 73 74 20 2e 20   (syntax (fst . 
f500: 72 73 74 29 29 0a 20 20 20 20 20 20 20 20 20 20  rst)).          
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 65 78        (syntax ex
f540: 70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p).             
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 28 6c 61 6d 62 64 61 20 28 6e 65 77 2d     (lambda (new-
f580: 70 76 61 72 2d 6c 73 74 20 6e 65 77 2d 63 61 74  pvar-lst new-cat
f590: 61 2d 64 65 66 73 20 6e 65 77 2d 64 6f 74 74 65  a-defs new-dotte
f5a0: 64 2d 76 61 72 73 29 0a 20 20 20 20 20 20 20 20  d-vars).        
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65            (value
f5e0: 73 20 28 70 72 6f 63 65 73 73 2d 63 61 74 61 2d  s (process-cata-
f5f0: 64 65 66 73 20 6e 65 77 2d 63 61 74 61 2d 64 65  defs new-cata-de
f600: 66 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  fs.             
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 28 70 72 6f 63 65 73 73 2d 6f 75 74 70 75 74 2d  (process-output-
f660: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  action.         
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 62 65       (syntax (be
f6c0: 67 69 6e 20 61 63 74 69 6f 6e 30 0a 20 20 20 20  gin action0.    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20           action 
f730: 2e 2e 2e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ...)).          
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 6e 65 77 2d 64 6f 74 74 65 64 2d 76      new-dotted-v
f790: 61 72 73 29 29 0a 20 20 20 20 20 20 20 20 20 20  ars)).          
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 6e 65 77 2d 70 76 61 72 2d 6c 73 74 0a 20 20 20  new-pvar-lst.   
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 20 20 20 6e 65 77 2d 63 61 74 61 2d         new-cata-
f820: 64 65 66 73 0a 20 20 20 20 20 20 20 20 20 20 20  defs.           
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
f860: 65 77 2d 64 6f 74 74 65 64 2d 76 61 72 73 29 29  ew-dotted-vars))
f870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 66 61 69 6c 2d 6b 0a 20 20 20 20 20 20 20 20   fail-k.        
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 20 20 20 20 20 20 27 28 29 0a 20 20 20 20          '().    
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 20 20              0.  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
f940: 78 74 72 61 63 74 2d 63 61 74 61 2d 66 75 6e 20  xtract-cata-fun 
f950: 28 73 79 6e 74 61 78 20 63 61 74 61 2d 66 75 6e  (syntax cata-fun
f960: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 27 28 29 0a 20 20 20 20 20 20 20 20 20     '().         
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 20 27 28 29 29 5d 29 0a 20 20         '())]).  
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 77 69               (wi
f9e0: 74 68 2d 73 79 6e 74 61 78 20 28 5b 66 61 69 6c  th-syntax ([fail
f9f0: 2d 74 6f 20 66 61 69 6c 2d 6b 5d 0a 20 20 20 20  -to fail-k].    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 20 5b 62 6f 64 79 20 72           [body r
fa20: 65 73 75 6c 74 5d 29 0a 20 20 20 20 20 20 20 20  esult]).        
fa30: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78           (syntax
fa40: 20 28 6c 65 74 20 28 5b 66 61 69 6c 2d 74 6f 20   (let ([fail-to 
fa50: 66 61 69 6c 2d 65 78 70 5d 29 0a 20 20 20 20 20  fail-exp]).     
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 62 6f 64 79 29 29 29 29 5d 0a        body))))].
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 63 6f              [(co
fa90: 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 28 69  mpile-clause ((i
faa0: 20 2e 2e 2e 29 20 28 67 75 61 72 64 20 67 65 78   ...) (guard gex
fab0: 70 20 2e 2e 2e 29 20 61 63 74 69 6f 6e 30 20 61  p ...) action0 a
fac0: 63 74 69 6f 6e 20 2e 2e 2e 29 20 65 78 70 20 63  ction ...) exp c
fad0: 61 74 61 2d 66 75 6e 20 66 61 69 6c 2d 65 78 70  ata-fun fail-exp
fae0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ).             (
faf0: 73 78 6d 6c 2d 6d 61 74 63 68 2d 73 79 6e 74 61  sxml-match-synta
fb00: 78 2d 65 72 72 6f 72 20 22 62 61 64 20 70 61 74  x-error "bad pat
fb10: 74 65 72 6e 20 73 79 6e 74 61 78 20 28 6e 6f 74  tern syntax (not
fb20: 20 61 6e 20 65 6c 65 6d 65 6e 74 20 70 61 74 74   an element patt
fb30: 65 72 6e 29 22 0a 20 20 20 20 20 20 20 20 20 20  ern)".          
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 78 0a              stx.
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 28 69        (syntax (i
fb90: 20 2e 2e 2e 29 29 29 5d 0a 20 20 20 20 20 20 20   ...)))].       
fba0: 20 20 20 20 20 5b 28 63 6f 6d 70 69 6c 65 2d 63       [(compile-c
fbb0: 6c 61 75 73 65 20 28 28 69 20 2e 2e 2e 29 20 61  lause ((i ...) a
fbc0: 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20 2e 2e  ction0 action ..
fbd0: 2e 29 20 65 78 70 20 63 61 74 61 2d 66 75 6e 20  .) exp cata-fun 
fbe0: 66 61 69 6c 2d 65 78 70 29 0a 20 20 20 20 20 20  fail-exp).      
fbf0: 20 20 20 20 20 20 20 28 73 78 6d 6c 2d 6d 61 74         (sxml-mat
fc00: 63 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f 72 20  ch-syntax-error 
fc10: 22 62 61 64 20 70 61 74 74 65 72 6e 20 73 79 6e  "bad pattern syn
fc20: 74 61 78 20 28 6e 6f 74 20 61 6e 20 65 6c 65 6d  tax (not an elem
fc30: 65 6e 74 20 70 61 74 74 65 72 6e 29 22 0a 20 20  ent pattern)".  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 73 74 78 0a 20 20 20 20 20 20 20 20      stx.        
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
fc90: 79 6e 74 61 78 20 28 69 20 2e 2e 2e 29 29 29 5d  yntax (i ...)))]
fca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 28 63  .            [(c
fcb0: 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 70  ompile-clause (p
fcc0: 61 74 20 28 67 75 61 72 64 20 67 65 78 70 20 2e  at (guard gexp .
fcd0: 2e 2e 29 20 61 63 74 69 6f 6e 30 20 61 63 74 69  ..) action0 acti
fce0: 6f 6e 20 2e 2e 2e 29 20 65 78 70 20 63 61 74 61  on ...) exp cata
fcf0: 2d 66 75 6e 20 66 61 69 6c 2d 65 78 70 29 0a 20  -fun fail-exp). 
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 64 65              (ide
fd10: 6e 74 69 66 69 65 72 3f 20 28 73 79 6e 74 61 78  ntifier? (syntax
fd20: 20 70 61 74 29 29 0a 20 20 20 20 20 20 20 20 20   pat)).         
fd30: 20 20 20 20 28 73 78 6d 6c 2d 6d 61 74 63 68 2d      (sxml-match-
fd40: 73 79 6e 74 61 78 2d 65 72 72 6f 72 20 22 62 61  syntax-error "ba
fd50: 64 20 70 61 74 74 65 72 6e 20 73 79 6e 74 61 78  d pattern syntax
fd60: 20 28 73 79 6d 62 6f 6c 20 6e 6f 74 20 61 6c 6c   (symbol not all
fd70: 6f 77 65 64 20 69 6e 20 74 68 69 73 20 63 6f 6e  owed in this con
fd80: 74 65 78 74 29 22 0a 20 20 20 20 20 20 20 20 20  text)".         
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 78               stx
fdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 20 70         (syntax p
fde0: 61 74 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  at))].          
fdf0: 20 20 5b 28 63 6f 6d 70 69 6c 65 2d 63 6c 61 75    [(compile-clau
fe00: 73 65 20 28 70 61 74 20 61 63 74 69 6f 6e 30 20  se (pat action0 
fe10: 61 63 74 69 6f 6e 20 2e 2e 2e 29 20 65 78 70 20  action ...) exp 
fe20: 63 61 74 61 2d 66 75 6e 20 66 61 69 6c 2d 65 78  cata-fun fail-ex
fe30: 70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p).             
fe40: 28 69 64 65 6e 74 69 66 69 65 72 3f 20 28 73 79  (identifier? (sy
fe50: 6e 74 61 78 20 70 61 74 29 29 0a 20 20 20 20 20  ntax pat)).     
fe60: 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d 6d 61          (sxml-ma
fe70: 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f 72  tch-syntax-error
fe80: 20 22 62 61 64 20 70 61 74 74 65 72 6e 20 73 79   "bad pattern sy
fe90: 6e 74 61 78 20 28 73 79 6d 62 6f 6c 20 6e 6f 74  ntax (symbol not
fea0: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 69 73   allowed in this
feb0: 20 63 6f 6e 74 65 78 74 29 22 0a 20 20 20 20 20   context)".     
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 73 74 78 0a 20 20 20 20 20 20 20 20 20 20 20   stx.           
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74             (synt
ff10: 61 78 20 70 61 74 29 29 5d 0a 20 20 20 20 20 20  ax pat))].      
ff20: 20 20 20 20 20 20 5b 28 63 6f 6d 70 69 6c 65 2d        [(compile-
ff30: 63 6c 61 75 73 65 20 28 6c 69 74 65 72 61 6c 20  clause (literal 
ff40: 28 67 75 61 72 64 20 67 65 78 70 20 2e 2e 2e 29  (guard gexp ...)
ff50: 20 61 63 74 69 6f 6e 30 20 61 63 74 69 6f 6e 20   action0 action 
ff60: 2e 2e 2e 29 20 65 78 70 20 63 61 74 61 2d 66 75  ...) exp cata-fu
ff70: 6e 20 66 61 69 6c 2d 65 78 70 29 0a 20 20 20 20  n fail-exp).    
ff80: 20 20 20 20 20 20 20 20 20 28 6c 69 74 65 72 61           (litera
ff90: 6c 3f 20 28 73 79 6e 74 61 78 20 6c 69 74 65 72  l? (syntax liter
ffa0: 61 6c 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  al)).           
ffb0: 20 20 28 73 79 6e 74 61 78 20 28 69 66 20 28 61    (syntax (if (a
ffc0: 6e 64 20 28 65 71 75 61 6c 3f 20 6c 69 74 65 72  nd (equal? liter
ffd0: 61 6c 20 65 78 70 29 20 28 61 6e 64 20 67 65 78  al exp) (and gex
ffe0: 70 20 2e 2e 2e 29 29 0a 20 20 20 20 20 20 20 20  p ...)).        
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 28 62 65 67 69 6e 20 61 63 74 69 6f 6e 30 20   (begin action0 
10010 61 63 74 69 6f 6e 20 2e 2e 2e 29 0a 20 20 20 20  action ...).    
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 20 20 28 66 61 69 6c 2d 65 78 70 29 29       (fail-exp))
10040 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  )].            [
10050 28 63 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20  (compile-clause 
10060 28 6c 69 74 65 72 61 6c 20 61 63 74 69 6f 6e 30  (literal action0
10070 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 20 65 78 70   action ...) exp
10080 20 63 61 74 61 2d 66 75 6e 20 66 61 69 6c 2d 65   cata-fun fail-e
10090 78 70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp).            
100a0 20 28 6c 69 74 65 72 61 6c 3f 20 28 73 79 6e 74   (literal? (synt
100b0 61 78 20 6c 69 74 65 72 61 6c 29 29 0a 20 20 20  ax literal)).   
100c0 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61            (synta
100d0 78 20 28 69 66 20 28 65 71 75 61 6c 3f 20 6c 69  x (if (equal? li
100e0 74 65 72 61 6c 20 65 78 70 29 0a 20 20 20 20 20  teral exp).     
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10100 20 20 20 20 28 62 65 67 69 6e 20 61 63 74 69 6f      (begin actio
10110 6e 30 20 61 63 74 69 6f 6e 20 2e 2e 2e 29 0a 20  n0 action ...). 
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 20 20 20 20 20 28 66 61 69 6c 2d 65 78          (fail-ex
10140 70 29 29 29 5d 29 29 29 29 29 0a 20 20 0a 20 20  p)))]))))).  .  
10150 29 0a 0a 28 6d 6f 64 75 6c 65 20 6d 61 74 63 68  )..(module match
10160 65 72 2d 68 65 6c 70 65 72 20 28 73 78 6d 6c 2d  er-helper (sxml-
10170 6d 61 74 63 68 31 29 0a 20 20 0a 20 20 28 69 6d  match1).  .  (im
10180 70 6f 72 74 20 70 6f 72 74 61 62 69 6c 69 74 79  port portability
10190 29 0a 20 20 28 69 6d 70 6f 72 74 20 69 6e 74 65  ).  (import inte
101a0 72 6e 61 6c 2d 63 6f 6d 70 69 6c 65 2d 63 6c 61  rnal-compile-cla
101b0 75 73 65 29 0a 20 20 0a 20 20 28 64 65 66 69 6e  use).  .  (defin
101c0 65 2d 73 79 6e 74 61 78 20 73 78 6d 6c 2d 6d 61  e-syntax sxml-ma
101d0 74 63 68 31 0a 20 20 20 20 28 73 79 6e 74 61 78  tch1.    (syntax
101e0 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20  -rules ().      
101f0 5b 28 73 78 6d 6c 2d 6d 61 74 63 68 31 20 65 78  [(sxml-match1 ex
10200 70 20 63 61 74 61 2d 66 75 6e 20 63 6c 61 75 73  p cata-fun claus
10210 65 29 0a 20 20 20 20 20 20 20 28 63 6f 6d 70 69  e).       (compi
10220 6c 65 2d 63 6c 61 75 73 65 20 63 6c 61 75 73 65  le-clause clause
10230 20 65 78 70 20 63 61 74 61 2d 66 75 6e 0a 20 20   exp cata-fun.  
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29 20       (lambda () 
10260 28 65 72 72 6f 72 20 27 73 78 6d 6c 2d 6d 61 74  (error 'sxml-mat
10270 63 68 20 22 6e 6f 20 6d 61 74 63 68 69 6e 67 20  ch "no matching 
10280 63 6c 61 75 73 65 20 66 6f 75 6e 64 22 29 29 29  clause found")))
10290 5d 0a 20 20 20 20 20 20 5b 28 73 78 6d 6c 2d 6d  ].      [(sxml-m
102a0 61 74 63 68 31 20 65 78 70 20 63 61 74 61 2d 66  atch1 exp cata-f
102b0 75 6e 20 63 6c 61 75 73 65 30 20 63 6c 61 75 73  un clause0 claus
102c0 65 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 28 6c  e ...).       (l
102d0 65 74 2f 65 63 20 65 73 63 61 70 65 0a 20 20 20  et/ec escape.   
102e0 20 20 20 20 20 20 28 63 6f 6d 70 69 6c 65 2d 63        (compile-c
102f0 6c 61 75 73 65 20 63 6c 61 75 73 65 30 20 65 78  lause clause0 ex
10300 70 20 63 61 74 61 2d 66 75 6e 0a 20 20 20 20 20  p cata-fun.     
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29 20 28      (lambda () (
10330 65 73 63 61 70 65 20 28 73 78 6d 6c 2d 6d 61 74  escape (sxml-mat
10340 63 68 31 20 65 78 70 20 63 61 74 61 2d 66 75 6e  ch1 exp cata-fun
10350 20 63 6c 61 75 73 65 20 2e 2e 2e 29 29 29 29 29   clause ...)))))
10360 5d 29 29 0a 20 20 29 0a 0a 28 6d 6f 64 75 6c 65  ])).  )..(module
10370 20 6d 61 74 63 68 2d 6c 65 74 2d 6d 65 74 61 2d   match-let-meta-
10380 68 65 6c 70 65 72 20 28 73 78 6d 6c 2d 6d 61 74  helper (sxml-mat
10390 63 68 2d 6c 65 74 31 29 0a 20 20 0a 20 20 28 69  ch-let1).  .  (i
103a0 6d 70 6f 72 74 20 69 6e 74 65 72 6e 61 6c 2d 63  mport internal-c
103b0 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 29 0a 20  ompile-clause). 
103c0 20 0a 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74   .  (define-synt
103d0 61 78 20 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65  ax sxml-match-le
103e0 74 31 0a 20 20 20 20 28 73 79 6e 74 61 78 2d 72  t1.    (syntax-r
103f0 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20 5b 28  ules ().      [(
10400 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 31 20  sxml-match-let1 
10410 73 79 6e 74 61 67 20 73 79 6e 66 6f 72 6d 20 28  syntag synform (
10420 29 20 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e 2e  ) body0 body ...
10430 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 29  ).       (let ()
10440 20 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e 2e 29   body0 body ...)
10450 5d 0a 20 20 20 20 20 20 5b 28 73 78 6d 6c 2d 6d  ].      [(sxml-m
10460 61 74 63 68 2d 6c 65 74 31 20 73 79 6e 74 61 67  atch-let1 syntag
10470 20 73 79 6e 66 6f 72 6d 20 28 5b 70 61 74 20 65   synform ([pat e
10480 78 70 5d 29 20 62 6f 64 79 30 20 62 6f 64 79 20  xp]) body0 body 
10490 2e 2e 2e 29 0a 20 20 20 20 20 20 20 28 63 6f 6d  ...).       (com
104a0 70 69 6c 65 2d 63 6c 61 75 73 65 20 28 70 61 74  pile-clause (pat
104b0 20 28 6c 65 74 20 28 29 20 62 6f 64 79 30 20 62   (let () body0 b
104c0 6f 64 79 20 2e 2e 2e 29 29 0a 20 20 20 20 20 20  ody ...)).      
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 65 78 70 0a 20 20 20 20 20 20 20 20 20 20 20   exp.           
104f0 20 20 20 20 20 20 20 20 20 20 20 20 23 66 0a 20              #f. 
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29        (lambda ()
10520 20 28 65 72 72 6f 72 20 27 73 79 6e 74 61 67 20   (error 'syntag 
10530 22 63 6f 75 6c 64 20 6e 6f 74 20 6d 61 74 63 68  "could not match
10540 20 70 61 74 74 65 72 6e 20 7e 73 22 20 27 70 61   pattern ~s" 'pa
10550 74 29 29 29 5d 0a 20 20 20 20 20 20 5b 28 73 78  t)))].      [(sx
10560 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 31 20 73 79  ml-match-let1 sy
10570 6e 74 61 67 20 73 79 6e 66 6f 72 6d 20 28 5b 70  ntag synform ([p
10580 61 74 30 20 65 78 70 30 5d 20 5b 70 61 74 20 65  at0 exp0] [pat e
10590 78 70 5d 20 2e 2e 2e 29 20 62 6f 64 79 30 20 62  xp] ...) body0 b
105a0 6f 64 79 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ody ...).       
105b0 28 63 6f 6d 70 69 6c 65 2d 63 6c 61 75 73 65 20  (compile-clause 
105c0 28 70 61 74 30 20 28 73 78 6d 6c 2d 6d 61 74 63  (pat0 (sxml-matc
105d0 68 2d 6c 65 74 31 20 73 79 6e 74 61 67 20 73 79  h-let1 syntag sy
105e0 6e 66 6f 72 6d 20 28 5b 70 61 74 20 65 78 70 5d  nform ([pat exp]
105f0 20 2e 2e 2e 29 20 62 6f 64 79 30 20 62 6f 64 79   ...) body0 body
10600 20 2e 2e 2e 29 29 0a 20 20 20 20 20 20 20 20 20   ...)).         
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
10620 70 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p0.             
10630 20 20 20 20 20 20 20 20 20 20 23 66 0a 20 20 20            #f.   
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29 20 28      (lambda () (
10660 65 72 72 6f 72 20 27 73 79 6e 74 61 67 20 22 63  error 'syntag "c
10670 6f 75 6c 64 20 6e 6f 74 20 6d 61 74 63 68 20 70  ould not match p
10680 61 74 74 65 72 6e 20 7e 73 22 20 27 70 61 74 30  attern ~s" 'pat0
10690 29 29 29 5d 29 29 0a 20 20 0a 20 20 29 0a 0a 28  )))])).  .  )..(
106a0 6d 6f 64 75 6c 65 20 6d 61 74 63 68 2d 6c 65 74  module match-let
106b0 2d 68 65 6c 70 65 72 20 28 73 78 6d 6c 2d 6d 61  -helper (sxml-ma
106c0 74 63 68 2d 6c 65 74 2d 68 65 6c 70 29 0a 20 20  tch-let-help).  
106d0 0a 20 20 28 69 6d 70 6f 72 74 20 6d 61 74 63 68  .  (import match
106e0 2d 6c 65 74 2d 6d 65 74 61 2d 68 65 6c 70 65 72  -let-meta-helper
106f0 29 0a 20 20 0a 20 20 28 64 65 66 69 6e 65 2d 73  ).  .  (define-s
10700 79 6e 74 61 78 20 73 78 6d 6c 2d 6d 61 74 63 68  yntax sxml-match
10710 2d 6c 65 74 2d 68 65 6c 70 0a 20 20 20 20 28 6c  -let-help.    (l
10720 61 6d 62 64 61 20 28 73 74 78 29 0a 20 20 20 20  ambda (stx).    
10730 20 20 28 73 79 6e 74 61 78 2d 63 61 73 65 20 73    (syntax-case s
10740 74 78 20 28 29 0a 20 20 20 20 20 20 20 20 5b 28  tx ().        [(
10750 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 2d 68  sxml-match-let-h
10760 65 6c 70 20 73 79 6e 74 61 67 20 73 79 6e 66 6f  elp syntag synfo
10770 72 6d 20 28 5b 70 61 74 20 65 78 70 5d 20 2e 2e  rm ([pat exp] ..
10780 2e 29 20 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e  .) body0 body ..
10790 2e 29 0a 20 20 20 20 20 20 20 20 20 28 77 69 74  .).         (wit
107a0 68 2d 73 79 6e 74 61 78 20 28 5b 28 74 65 6d 70  h-syntax ([(temp
107b0 2d 6e 61 6d 65 20 2e 2e 2e 29 20 28 67 65 6e 65  -name ...) (gene
107c0 72 61 74 65 2d 74 65 6d 70 6f 72 61 72 69 65 73  rate-temporaries
107d0 20 28 73 79 6e 74 61 78 20 28 65 78 70 20 2e 2e   (syntax (exp ..
107e0 2e 29 29 29 5d 29 0a 20 20 20 20 20 20 20 20 20  .)))]).         
107f0 20 20 28 73 79 6e 74 61 78 20 28 6c 65 74 20 28    (syntax (let (
10800 5b 74 65 6d 70 2d 6e 61 6d 65 20 65 78 70 5d 20  [temp-name exp] 
10810 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 20 20 20  ...).           
10820 20 20 20 20 20 20 20 20 20 20 28 73 78 6d 6c 2d            (sxml-
10830 6d 61 74 63 68 2d 6c 65 74 31 20 73 79 6e 74 61  match-let1 synta
10840 67 20 73 79 6e 66 6f 72 6d 20 28 5b 70 61 74 20  g synform ([pat 
10850 74 65 6d 70 2d 6e 61 6d 65 5d 20 2e 2e 2e 29 20  temp-name] ...) 
10860 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e 2e 29 29  body0 body ...))
10870 29 29 5d 29 29 29 0a 20 20 0a 20 20 29 0a 0a 28  ))]))).  .  )..(
10880 6d 6f 64 75 6c 65 20 73 78 6d 6c 2d 6d 61 74 63  module sxml-matc
10890 68 65 72 20 28 73 78 6d 6c 2d 6d 61 74 63 68 20  her (sxml-match 
108a0 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 20 73  sxml-match-let s
108b0 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 2a 29 0a  xml-match-let*).
108c0 20 20 0a 20 20 28 69 6d 70 6f 72 74 20 6d 61 74    .  (import mat
108d0 63 68 65 72 2d 68 65 6c 70 65 72 29 0a 20 20 28  cher-helper).  (
108e0 69 6d 70 6f 72 74 20 6d 61 74 63 68 2d 6c 65 74  import match-let
108f0 2d 68 65 6c 70 65 72 29 0a 20 20 0a 20 20 28 64  -helper).  .  (d
10900 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 73 78 6d  efine-syntax sxm
10910 6c 2d 6d 61 74 63 68 0a 20 20 20 20 28 73 79 6e  l-match.    (syn
10920 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20  tax-rules ().   
10930 20 20 20 28 28 73 78 6d 6c 2d 6d 61 74 63 68 20     ((sxml-match 
10940 76 61 6c 20 63 6c 61 75 73 65 30 20 63 6c 61 75  val clause0 clau
10950 73 65 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 28  se ...).       (
10960 6c 65 74 72 65 63 20 28 5b 63 66 75 6e 20 28 6c  letrec ([cfun (l
10970 61 6d 62 64 61 20 28 65 78 70 29 0a 20 20 20 20  ambda (exp).    
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 20 28 73 78 6d 6c 2d 6d 61 74 63 68 31      (sxml-match1
109a0 20 65 78 70 20 63 66 75 6e 20 63 6c 61 75 73 65   exp cfun clause
109b0 30 20 63 6c 61 75 73 65 20 2e 2e 2e 29 29 5d 29  0 clause ...))])
109c0 0a 20 20 20 20 20 20 20 20 20 28 63 66 75 6e 20  .         (cfun 
109d0 76 61 6c 29 29 29 29 29 0a 20 20 0a 20 20 28 64  val))))).  .  (d
109e0 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 73 78 6d  efine-syntax sxm
109f0 6c 2d 6d 61 74 63 68 2d 6c 65 74 0a 20 20 20 20  l-match-let.    
10a00 28 6c 61 6d 62 64 61 20 28 73 74 78 29 0a 20 20  (lambda (stx).  
10a10 20 20 20 20 28 73 79 6e 74 61 78 2d 63 61 73 65      (syntax-case
10a20 20 73 74 78 20 28 29 0a 20 20 20 20 20 20 20 20   stx ().        
10a30 5b 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74  [(sxml-match-let
10a40 20 28 5b 70 61 74 20 65 78 70 5d 20 2e 2e 2e 29   ([pat exp] ...)
10a50 20 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e 2e 29   body0 body ...)
10a60 0a 20 20 20 20 20 20 20 20 20 28 77 69 74 68 2d  .         (with-
10a70 73 79 6e 74 61 78 20 28 5b 73 79 6e 66 6f 72 6d  syntax ([synform
10a80 20 73 74 78 5d 29 0a 20 20 20 20 20 20 20 20 20   stx]).         
10a90 20 20 28 73 79 6e 74 61 78 20 28 73 78 6d 6c 2d    (syntax (sxml-
10aa0 6d 61 74 63 68 2d 6c 65 74 2d 68 65 6c 70 20 73  match-let-help s
10ab0 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 20 73 79  xml-match-let sy
10ac0 6e 66 6f 72 6d 20 28 5b 70 61 74 20 65 78 70 5d  nform ([pat exp]
10ad0 20 2e 2e 2e 29 20 62 6f 64 79 30 20 62 6f 64 79   ...) body0 body
10ae0 20 2e 2e 2e 29 29 29 5d 29 29 29 0a 20 20 0a 20   ...)))]))).  . 
10af0 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20   (define-syntax 
10b00 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 2a 0a  sxml-match-let*.
10b10 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74 78      (lambda (stx
10b20 29 0a 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d  ).      (syntax-
10b30 63 61 73 65 20 73 74 78 20 28 29 0a 20 20 20 20  case stx ().    
10b40 20 20 20 20 5b 28 73 78 6d 6c 2d 6d 61 74 63 68      [(sxml-match
10b50 2d 6c 65 74 2a 20 28 29 20 62 6f 64 79 30 20 62  -let* () body0 b
10b60 6f 64 79 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ody ...).       
10b70 20 20 28 73 79 6e 74 61 78 20 28 6c 65 74 20 28    (syntax (let (
10b80 29 20 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e 2e  ) body0 body ...
10b90 29 29 5d 0a 20 20 20 20 20 20 20 20 5b 28 73 78  ))].        [(sx
10ba0 6d 6c 2d 6d 61 74 63 68 2d 6c 65 74 2a 20 28 5b  ml-match-let* ([
10bb0 70 61 74 30 20 65 78 70 30 5d 20 5b 70 61 74 20  pat0 exp0] [pat 
10bc0 65 78 70 5d 20 2e 2e 2e 29 20 62 6f 64 79 30 20  exp] ...) body0 
10bd0 62 6f 64 79 20 2e 2e 2e 29 0a 20 20 20 20 20 20  body ...).      
10be0 20 20 20 28 77 69 74 68 2d 73 79 6e 74 61 78 20     (with-syntax 
10bf0 28 5b 73 79 6e 66 6f 72 6d 20 73 74 78 5d 29 0a  ([synform stx]).
10c00 20 20 20 20 20 20 20 20 20 20 20 28 73 79 6e 74             (synt
10c10 61 78 20 28 73 78 6d 6c 2d 6d 61 74 63 68 2d 6c  ax (sxml-match-l
10c20 65 74 2d 68 65 6c 70 20 73 78 6d 6c 2d 6d 61 74  et-help sxml-mat
10c30 63 68 2d 6c 65 74 2a 20 73 79 6e 66 6f 72 6d 20  ch-let* synform 
10c40 28 5b 70 61 74 30 20 65 78 70 30 5d 29 0a 20 20  ([pat0 exp0]).  
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 20 28 73 78 6d 6c 2d 6d 61 74 63        (sxml-matc
10c80 68 2d 6c 65 74 2a 20 28 5b 70 61 74 20 65 78 70  h-let* ([pat exp
10c90 5d 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 20  ] ...).         
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 62 6f 64 79 30 20 62 6f 64 79 20 2e 2e 2e 29   body0 body ...)
10cd0 29 29 29 5d 29 29 29 0a 20 20 0a 20 20 29 0a 0a  )))]))).  .  )..