home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / guile-ii.src / guile-ii / guile-src / slib / match-slib.scm < prev    next >
Encoding:
Text File  |  1995-05-04  |  188.4 KB  |  2,657 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;; Pattern Matching Syntactic Extensions for Scheme
  3. ;;
  4. (define match:version "Version 1.10, Nov 10, 1994")
  5. ;;
  6. ;; Report bugs to wright@research.nj.nec.com.  The most recent version of
  7. ;; this software can be obtained by anonymous FTP from ftp.nj.nec.com
  8. ;; in file pub/wright/match.tar.Z.  Be sure to set "type binary" when
  9. ;; transferring this file.
  10. ;;
  11. ;; Written by Andrew K. Wright, 1993 (wright@research.nj.nec.com).
  12. ;; Adapted from code originally written by Bruce F. Duba, 1991.
  13. ;; This package also includes a modified version of Kent Dybvig's
  14. ;; define-structure (see Dybvig, R.K., The Scheme Programming Language,
  15. ;; Prentice-Hall, NJ, 1987).
  16. ;;
  17. ;; This software is in the public domain.  Feel free to copy,
  18. ;; distribute, and modify this software as desired.  No warranties
  19. ;; nor guarantees of any kind apply.  Please return any improvements
  20. ;; or bug fixes to wright@research.nj.nec.com so that they may be included
  21. ;; in future releases.
  22. ;;
  23. ;; This macro package extends Scheme with several new expression forms.
  24. ;; Following is a brief summary of the new forms.  See the associated
  25. ;; LaTeX documentation for a full description of their functionality.
  26. ;;
  27. ;;
  28. ;;         match expressions:
  29. ;;
  30. ;; exp ::= ...
  31. ;;       | (match exp clause ...)
  32. ;;       | (match-lambda clause ...)
  33. ;;       | (match-lambda* clause ...)
  34. ;;       | (match-let ((pat exp) ...) body)
  35. ;;       | (match-let* ((pat exp) ...) body)
  36. ;;       | (match-letrec ((pat exp) ...) body)
  37. ;;       | (match-define pat exp)
  38. ;;
  39. ;; clause ::= (pat body) | (pat => exp)
  40. ;;
  41. ;;         patterns:                       matches:
  42. ;;
  43. ;; pat ::= identifier                      anything, and binds identifier
  44. ;;       | _                               anything
  45. ;;       | ()                              the empty list
  46. ;;       | #t                              #t
  47. ;;       | #f                              #f
  48. ;;       | string                          a string
  49. ;;       | number                          a number
  50. ;;       | character                       a character
  51. ;;       | 'sexp                           an s-expression
  52. ;;       | 'symbol                         a symbol (special case of s-expr)
  53. ;;       | (pat_1 ... pat_n)               list of n elements
  54. ;;       | (pat_1 ... pat_n . pat_{n+1})   list of n or more
  55. ;;       | (pat_1 ... pat_n pat_n+1 ooo)   list of n or more, each element
  56. ;;                                           of remainder must match pat_n+1
  57. ;;       | #(pat_1 ... pat_n)              vector of n elements
  58. ;;       | #(pat_1 ... pat_n pat_n+1 ooo)  vector of n or more, each element
  59. ;;                                           of remainder must match pat_n+1
  60. ;;       | #&pat                           box
  61. ;;       | ($ struct-name pat_1 ... pat_n) a structure
  62. ;;       | (and pat_1 ... pat_n)           if all of pat_1 thru pat_n match
  63. ;;       | (or pat_1 ... pat_n)            if any of pat_1 thru pat_n match
  64. ;;       | (not pat_1 ... pat_n)           if all pat_1 thru pat_n don't match
  65. ;;       | (? predicate pat_1 ... pat_n)   if predicate true and all of
  66. ;;                                           pat_1 thru pat_n match
  67. ;;       | (set! identifier)               anything, and binds setter
  68. ;;       | (get! identifier)               anything, and binds getter
  69. ;;       | `qp                             a quasi-pattern
  70. ;;
  71. ;; ooo ::= ...                             zero or more
  72. ;;       | ___                             zero or more
  73. ;;       | ..k                             k or more
  74. ;;       | __k                             k or more
  75. ;;
  76. ;;         quasi-patterns:                 matches:
  77. ;;
  78. ;; qp  ::= ()                              the empty list
  79. ;;       | #t                              #t
  80. ;;       | #f                              #f
  81. ;;       | string                          a string
  82. ;;       | number                          a number
  83. ;;       | character                       a character
  84. ;;       | identifier                      a symbol
  85. ;;       | (qp_1 ... qp_n)                 list of n elements
  86. ;;       | (qp_1 ... qp_n . qp_{n+1})      list of n or more
  87. ;;       | (qp_1 ... qp_n qp_n+1 ooo)      list of n or more, each element
  88. ;;                                           of remainder must match qp_n+1
  89. ;;       | #(qp_1 ... qp_n)                vector of n elements
  90. ;;       | #(qp_1 ... qp_n qp_n+1 ooo)     vector of n or more, each element
  91. ;;                                           of remainder must match qp_n+1
  92. ;;       | #&qp                            box
  93. ;;       | ,pat                            a pattern
  94. ;;       | ,@pat                           a pattern
  95. ;;
  96. ;; The names (quote, quasiquote, unquote, unquote-splicing, ?, _, $,
  97. ;; and, or, not, set!, get!, ..., ___) cannot be used as pattern variables.
  98. ;;
  99. ;;
  100. ;;         structure expressions:
  101. ;;
  102. ;; exp ::= ...
  103. ;;       | (define-structure (id_0 id_1 ... id_n))
  104. ;;       | (define-structure (id_0 id_1 ... id_n)
  105. ;;                           ((id_{n+1} exp_1) ... (id_{n+m} exp_m)))
  106. ;;       | (define-const-structure (id_0 arg_1 ... arg_n))
  107. ;;       | (define-const-structure (id_0 arg_1 ... arg_n)
  108. ;;                                 ((arg_{n+1} exp_1) ... (arg_{n+m} exp_m)))
  109. ;;
  110. ;; arg ::= id | (! id)
  111. ;;
  112. ;;
  113. ;; match:error-control controls what code is generated for failed matches.
  114. ;; Possible values:
  115. ;;  'unspecified - do nothing, ie., evaluate (cond [#f #f])
  116. ;;  'fail - call match:error, or die at car or cdr
  117. ;;  'error - call match:error with the unmatched value
  118. ;;  'match - call match:error with the unmatched value _and_
  119. ;;             the quoted match expression
  120. ;; match:error-control is set by calling match:set-error-control with
  121. ;; the new value.
  122. ;;
  123. ;; match:error is called for a failed match.
  124. ;; match:error is set by calling match:set-error with the new value.
  125. ;;
  126. ;; match:structure-control controls the uniqueness of structures
  127. ;; (does not exist for Scheme 48 version).
  128. ;; Possible values:
  129. ;;  'vector - (default) structures are vectors with a symbol in position 0
  130. ;;  'disjoint - structures are fully disjoint from all other values
  131. ;; match:structure-control is set by calling match:set-structure-control
  132. ;; with the new value.
  133. ;;
  134. ;; match:runtime-structures controls whether local structure declarations
  135. ;; generate new structures each time they are reached
  136. ;; (does not exist for Scheme 48 version).
  137. ;; Possible values:
  138. ;;  #t - (default) each runtime occurrence generates a new structure
  139. ;;  #f - each lexical occurrence generates a new structure
  140. ;;
  141. ;; End of user visible/modifiable stuff.
  142. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  143.  
  144. (require 'pretty-print)
  145. (define match:error
  146.    (lambda (val . args)
  147.       (for-each pretty-print args)
  148.       (error "no matching clause for" val)))
  149. (define match:andmap
  150.    (lambda (f l)
  151.       (if (null? l)
  152.           (and)
  153.           (and (f (car l)) (match:andmap f (cdr l))))))
  154. (define match:syntax-err (lambda (obj msg) (error msg obj)))
  155. (define match:disjoint-structure-tags '())
  156. (define match:make-structure-tag
  157.    (lambda (name)
  158.       (let ((tag (gentemp)))
  159.          (set! match:disjoint-structure-tags
  160.             (cons tag match:disjoint-structure-tags))
  161.          tag)))
  162. (define match:structure?
  163.    (lambda (tag) (memq tag match:disjoint-structure-tags)))
  164. (define match:structure-control 'vector)
  165. (define match:set-structure-control
  166.    (lambda (v) (set! match:structure-control v)))
  167. (define match:set-error (lambda (v) (set! match:error v)))
  168. (define match:error-control 'error)
  169. (define match:set-error-control
  170.    (lambda (v) (set! match:error-control v)))
  171. (define match:disjoint-predicates
  172.    (cons 'null
  173.          '(pair?
  174.              symbol?
  175.              boolean?
  176.              number?
  177.              string?
  178.              char?
  179.              procedure?
  180.              vector?)))
  181. (define match:vector-structures '())
  182. (define match:expanders
  183.    (letrec ((genmatch (lambda (x clauses match-expr)
  184.                          (let* ((length>= (gentemp))
  185.                                 (eb-errf (error-maker match-expr))
  186.                                 (blist (car eb-errf))
  187.                                 (plist (map (lambda (c)
  188.                                                (let* ((x (bound
  189.                                                             (validate-pattern
  190.                                                                (car c))))
  191.                                                       (p (car x))
  192.                                                       (bv (cadr x))
  193.                                                       (bindings (caddr x))
  194.                                                       (code (gentemp))
  195.                                                       (fail (and (pair?
  196.                                                                     (cdr c))
  197.                                                                  (pair?
  198.                                                                     (cadr c))
  199.                                                                  (eq? (caadr
  200.                                                                          c)
  201.                                                                       '=>)
  202.                                                                  (symbol?
  203.                                                                     (cadadr
  204.                                                                        c))
  205.                                                                  (pair?
  206.                                                                     (cdadr
  207.                                                                        c))
  208.                                                                  (null?
  209.                                                                     (cddadr
  210.                                                                        c))
  211.                                                                  (pair?
  212.                                                                     (cddr c))
  213.                                                                  (cadadr
  214.                                                                     c)))
  215.                                                       (bv2 (if fail
  216.                                                                (cons fail
  217.                                                                      bv)
  218.                                                                bv))
  219.                                                       (body (if fail
  220.                                                                 (cddr c)
  221.                                                                 (cdr c))))
  222.                                                   (set! blist
  223.                                                      (cons `(,code
  224.                                                                (lambda ,bv2
  225.                                                                   ,@body))
  226.                                                            (append
  227.                                                               bindings
  228.                                                               blist)))
  229.                                                   (list p
  230.                                                         code
  231.                                                         bv
  232.                                                         (and fail
  233.                                                              (gentemp))
  234.                                                         #f)))
  235.                                             clauses))
  236.                                 (code (gen x
  237.                                            '()
  238.                                            plist
  239.                                            (cdr eb-errf)
  240.                                            length>=
  241.                                            (gentemp))))
  242.                             (unreachable plist match-expr)
  243.                             (inline-let
  244.                                `(let ((,length>= (lambda (n)
  245.                                                     (lambda (l)
  246.                                                        (>= (length l) n))))
  247.                                       ,@blist)
  248.                                    ,code)))))
  249.             (genletrec (lambda (pat exp body match-expr)
  250.                           (let* ((length>= (gentemp))
  251.                                  (eb-errf (error-maker match-expr))
  252.                                  (x (bound (validate-pattern pat)))
  253.                                  (p (car x))
  254.                                  (bv (cadr x))
  255.                                  (bindings (caddr x))
  256.                                  (code (gentemp))
  257.                                  (plist (list (list p code bv #f #f)))
  258.                                  (x (gentemp))
  259.                                  (m (gen x
  260.                                          '()
  261.                                          plist
  262.                                          (cdr eb-errf)
  263.                                          length>=
  264.                                          (gentemp)))
  265.                                  (gs (map (lambda (_) (gentemp)) bv)))
  266.                              (unreachable plist match-expr)
  267.                              `(letrec ((,length>= (lambda (n)
  268.                                                      (lambda (l)
  269.                                                         (>= (length l) n))))
  270.                                        ,@(map (lambda (v) `(,v #f)) bv)
  271.                                        (,x ,exp)
  272.                                        (,code (lambda ,gs
  273.                                                  ,@(map (lambda (v g)
  274.                                                            `(set! ,v ,g))
  275.                                                         bv
  276.                                                         gs)
  277.                                                  ,@body))
  278.                                        ,@bindings
  279.                                        ,@(car eb-errf))
  280.                                  ,m))))
  281.             (gendefine (lambda (pat exp match-expr)
  282.                           (let* ((length>= (gentemp))
  283.                                  (eb-errf (error-maker match-expr))
  284.                                  (x (bound (validate-pattern pat)))
  285.                                  (p (car x))
  286.                                  (bv (cadr x))
  287.                                  (bindings (caddr x))
  288.                                  (code (gentemp))
  289.                                  (plist (list (list p code bv #f #f)))
  290.                                  (x (gentemp))
  291.                                  (m (gen x
  292.                                          '()
  293.                                          plist
  294.                                          (cdr eb-errf)
  295.                                          length>=
  296.                                          (gentemp)))
  297.                                  (gs (map (lambda (_) (gentemp)) bv)))
  298.                              (unreachable plist match-expr)
  299.                              `(begin ,@(map (lambda (v) `(define ,v #f))
  300.                                             bv)
  301.                                      ,(inline-let
  302.                                          `(let ((,length>= (lambda (n)
  303.                                                               (lambda (l)
  304.                                                                  (>= (length
  305.                                                                         l)
  306.                                                                      n))))
  307.                                                 (,x ,exp)
  308.                                                 (,code (lambda ,gs
  309.                                                           ,@(map (lambda (v
  310.                                                                           g)
  311.                                                                     `(set! ,v
  312.                                                                         ,g))
  313.                                                                  bv
  314.                                                                  gs)
  315.                                                           (cond (#f #f))))
  316.                                                 ,@bindings
  317.                                                 ,@(car eb-errf))
  318.                                              ,m))))))
  319.             (pattern-var? (lambda (x)
  320.                              (and (symbol? x)
  321.                                   (not (dot-dot-k? x))
  322.                                   (not (memq x
  323.                                              '(quasiquote
  324.                                                  quote
  325.                                                  unquote
  326.                                                  unquote-splicing
  327.                                                  ?
  328.                                                  _
  329.                                                  $
  330.                                                  and
  331.                                                  or
  332.                                                  not
  333.                                                  set!
  334.                                                  get!
  335.                                                  ...
  336.                                                  ___))))))
  337.             (dot-dot-k? (lambda (s)
  338.                            (and (symbol? s)
  339.                                 (if (memq s '(... ___))
  340.                                     0
  341.                                     (let* ((s (symbol->string s))
  342.                                            (n (string-length s)))
  343.                                        (and (<= 3 n)
  344.                                             (memq (string-ref s 0)
  345.                                                   '(#\. #\_))
  346.                                             (memq (string-ref s 1)
  347.                                                   '(#\. #\_))
  348.                                             (match:andmap
  349.                                                char-numeric?
  350.                                                (string->list
  351.                                                   (substring s 2 n)))
  352.                                             (string->number
  353.                                                (substring s 2 n))))))))
  354.             (error-maker (lambda (match-expr)
  355.                             (cond
  356.                                ((eq? match:error-control 'unspecified) (cons '()
  357.                                                                              (lambda (x)
  358.                                                                                 `(cond
  359.                                                                                     (#f #f)))))
  360.                                ((memq match:error-control '(error fail)) (cons '()
  361.                                                                                (lambda (x)
  362.                                                                                   `(match:error
  363.                                                                                       ,x))))
  364.                                ((eq? match:error-control 'match) (let ((errf (gentemp))
  365.                                                                        (arg (gentemp)))
  366.                                                                     (cons `((,errf
  367.                                                                                (lambda (,arg)
  368.                                                                                   (match:error
  369.                                                                                      ,arg
  370.                                                                                      ',match-expr))))
  371.                                                                           (lambda (x)
  372.                                                                              `(,errf
  373.                                                                                  ,x)))))
  374.                                (else (match:syntax-err
  375.                                         '(unspecified error fail match)
  376.                                         "invalid value for match:error-control, legal values are")))))
  377.             (unreachable (lambda (plist match-expr)
  378.                             (for-each
  379.                                (lambda (x)
  380.                                   (if (not (car (cddddr x)))
  381.                                       (begin (display
  382.                                                 "Warning: unreachable pattern ")
  383.                                              (display (car x))
  384.                                              (display " in ")
  385.                                              (display match-expr)
  386.                                              (newline))))
  387.                                plist)))
  388.             (validate-pattern (lambda (pattern)
  389.                                  (letrec ((simple? (lambda (x)
  390.                                                       (or (string? x)
  391.                                                           (boolean? x)
  392.                                                           (char? x)
  393.                                                           (number? x)
  394.                                                           (null? x))))
  395.                                           (ordinary (lambda (p)
  396.                                                        (let ((g204 (lambda (x
  397.                                                                             y)
  398.                                                                       (cons (ordinary
  399.                                                                                x)
  400.                                                                             (ordinary
  401.                                                                                y)))))
  402.                                                           (if (simple? p)
  403.                                                               ((lambda (p)
  404.                                                                   p)
  405.                                                                p)
  406.                                                               (if (equal?
  407.                                                                      p
  408.                                                                      '_)
  409.                                                                   ((lambda ()
  410.                                                                       '_))
  411.                                                                   (if (pattern-var?
  412.                                                                          p)
  413.                                                                       ((lambda (p)
  414.                                                                           p)
  415.                                                                        p)
  416.                                                                       (if (pair?
  417.                                                                              p)
  418.                                                                           (if (equal?
  419.                                                                                  (car p)
  420.                                                                                  'quasiquote)
  421.                                                                               (if (and (pair?
  422.                                                                                           (cdr p))
  423.                                                                                        (null?
  424.                                                                                           (cddr p)))
  425.                                                                                   ((lambda (p)
  426.                                                                                       (quasi
  427.                                                                                          p))
  428.                                                                                    (cadr p))
  429.                                                                                   (g204 (car p)
  430.                                                                                         (cdr p)))
  431.                                                                               (if (equal?
  432.                                                                                      (car p)
  433.                                                                                      'quote)
  434.                                                                                   (if (and (pair?
  435.                                                                                               (cdr p))
  436.                                                                                            (null?
  437.                                                                                               (cddr p)))
  438.                                                                                       ((lambda (p)
  439.                                                                                           p)
  440.                                                                                        p)
  441.                                                                                       (g204 (car p)
  442.                                                                                             (cdr p)))
  443.                                                                                   (if (equal?
  444.                                                                                          (car p)
  445.                                                                                          '?)
  446.                                                                                       (if (and (pair?
  447.                                                                                                   (cdr p))
  448.                                                                                                (list?
  449.                                                                                                   (cddr p)))
  450.                                                                                           ((lambda (pred
  451.                                                                                                     ps)
  452.                                                                                               `(? ,pred
  453.                                                                                                   ,@(map ordinary
  454.                                                                                                          ps)))
  455.                                                                                            (cadr p)
  456.                                                                                            (cddr p))
  457.                                                                                           (g204 (car p)
  458.                                                                                                 (cdr p)))
  459.                                                                                       (if (equal?
  460.                                                                                              (car p)
  461.                                                                                              'and)
  462.                                                                                           (if (and (list?
  463.                                                                                                       (cdr p))
  464.                                                                                                    (pair?
  465.                                                                                                       (cdr p)))
  466.                                                                                               ((lambda (ps)
  467.                                                                                                   `(and ,@(map ordinary
  468.                                                                                                                ps)))
  469.                                                                                                (cdr p))
  470.                                                                                               (g204 (car p)
  471.                                                                                                     (cdr p)))
  472.                                                                                           (if (equal?
  473.                                                                                                  (car p)
  474.                                                                                                  'or)
  475.                                                                                               (if (and (list?
  476.                                                                                                           (cdr p))
  477.                                                                                                        (pair?
  478.                                                                                                           (cdr p)))
  479.                                                                                                   ((lambda (ps)
  480.                                                                                                       `(or ,@(map ordinary
  481.                                                                                                                   ps)))
  482.                                                                                                    (cdr p))
  483.                                                                                                   (g204 (car p)
  484.                                                                                                         (cdr p)))
  485.                                                                                               (if (equal?
  486.                                                                                                      (car p)
  487.                                                                                                      'not)
  488.                                                                                                   (if (and (list?
  489.                                                                                                               (cdr p))
  490.                                                                                                            (pair?
  491.                                                                                                               (cdr p)))
  492.                                                                                                       ((lambda (ps)
  493.                                                                                                           `(not ,@(map ordinary
  494.                                                                                                                        ps)))
  495.                                                                                                        (cdr p))
  496.                                                                                                       (g204 (car p)
  497.                                                                                                             (cdr p)))
  498.                                                                                                   (if (equal?
  499.                                                                                                          (car p)
  500.                                                                                                          '$)
  501.                                                                                                       (if (and (pair?
  502.                                                                                                                   (cdr p))
  503.                                                                                                                (symbol?
  504.                                                                                                                   (cadr p))
  505.                                                                                                                (list?
  506.                                                                                                                   (cddr p)))
  507.                                                                                                           ((lambda (r
  508.                                                                                                                     ps)
  509.                                                                                                               `($ ,r
  510.                                                                                                                   ,@(map ordinary
  511.                                                                                                                          ps)))
  512.                                                                                                            (cadr p)
  513.                                                                                                            (cddr p))
  514.                                                                                                           (g204 (car p)
  515.                                                                                                                 (cdr p)))
  516.                                                                                                       (if (equal?
  517.                                                                                                              (car p)
  518.                                                                                                              'set!)
  519.                                                                                                           (if (and (pair?
  520.                                                                                                                       (cdr p))
  521.                                                                                                                    (pattern-var?
  522.                                                                                                                       (cadr p))
  523.                                                                                                                    (null?
  524.                                                                                                                       (cddr p)))
  525.                                                                                                               ((lambda (p)
  526.                                                                                                                   p)
  527.                                                                                                                p)
  528.                                                                                                               (g204 (car p)
  529.                                                                                                                     (cdr p)))
  530.                                                                                                           (if (equal?
  531.                                                                                                                  (car p)
  532.                                                                                                                  'get!)
  533.                                                                                                               (if (and (pair?
  534.                                                                                                                           (cdr p))
  535.                                                                                                                        (pattern-var?
  536.                                                                                                                           (cadr p))
  537.                                                                                                                        (null?
  538.                                                                                                                           (cddr p)))
  539.                                                                                                                   ((lambda (p)
  540.                                                                                                                       p)
  541.                                                                                                                    p)
  542.                                                                                                                   (g204 (car p)
  543.                                                                                                                         (cdr p)))
  544.                                                                                                               (if (equal?
  545.                                                                                                                      (car p)
  546.                                                                                                                      'unquote)
  547.                                                                                                                   (g204 (car p)
  548.                                                                                                                         (cdr p))
  549.                                                                                                                   (if (equal?
  550.                                                                                                                          (car p)
  551.                                                                                                                          'unquote-splicing)
  552.                                                                                                                       (g204 (car p)
  553.                                                                                                                             (cdr p))
  554.                                                                                                                       (if (and (pair?
  555.                                                                                                                                   (cdr p))
  556.                                                                                                                                (dot-dot-k?
  557.                                                                                                                                   (cadr p))
  558.                                                                                                                                (null?
  559.                                                                                                                                   (cddr p)))
  560.                                                                                                                           ((lambda (p
  561.                                                                                                                                     ddk)
  562.                                                                                                                               `(,(ordinary
  563.                                                                                                                                     p)
  564.                                                                                                                                   ,ddk))
  565.                                                                                                                            (car p)
  566.                                                                                                                            (cadr p))
  567.                                                                                                                           (g204 (car p)
  568.                                                                                                                                 (cdr p))))))))))))))
  569.                                                                           (if (vector?
  570.                                                                                  p)
  571.                                                                               ((lambda (p)
  572.                                                                                   (let* ((pl (vector->list
  573.                                                                                                 p))
  574.                                                                                          (rpl (reverse
  575.                                                                                                  pl)))
  576.                                                                                      (apply
  577.                                                                                         vector
  578.                                                                                         (if (dot-dot-k?
  579.                                                                                                (car rpl))
  580.                                                                                             (reverse
  581.                                                                                                (cons (car rpl)
  582.                                                                                                      (map ordinary
  583.                                                                                                           (cdr rpl))))
  584.                                                                                             (map ordinary
  585.                                                                                                  pl)))))
  586.                                                                                p)
  587.                                                                               ((lambda ()
  588.                                                                                   (match:syntax-err
  589.                                                                                      pattern
  590.                                                                                      "syntax error in pattern")))))))))))
  591.                                           (quasi (lambda (p)
  592.                                                     (let ((g193 (lambda (x
  593.                                                                          y)
  594.                                                                    (cons (quasi
  595.                                                                             x)
  596.                                                                          (quasi
  597.                                                                             y)))))
  598.                                                        (if (simple? p)
  599.                                                            ((lambda (p) p)
  600.                                                             p)
  601.                                                            (if (symbol? p)
  602.                                                                ((lambda (p)
  603.                                                                    `',p)
  604.                                                                 p)
  605.                                                                (if (pair?
  606.                                                                       p)
  607.                                                                    (if (equal?
  608.                                                                           (car p)
  609.                                                                           'unquote)
  610.                                                                        (if (and (pair?
  611.                                                                                    (cdr p))
  612.                                                                                 (null?
  613.                                                                                    (cddr p)))
  614.                                                                            ((lambda (p)
  615.                                                                                (ordinary
  616.                                                                                   p))
  617.                                                                             (cadr p))
  618.                                                                            (g193 (car p)
  619.                                                                                  (cdr p)))
  620.                                                                        (if (and (pair?
  621.                                                                                    (car p))
  622.                                                                                 (equal?
  623.                                                                                    (caar p)
  624.                                                                                    'unquote-splicing)
  625.                                                                                 (pair?
  626.                                                                                    (cdar p))
  627.                                                                                 (null?
  628.                                                                                    (cddar
  629.                                                                                       p)))
  630.                                                                            (if (null?
  631.                                                                                   (cdr p))
  632.                                                                                ((lambda (p)
  633.                                                                                    (ordinary
  634.                                                                                       p))
  635.                                                                                 (cadar
  636.                                                                                    p))
  637.                                                                                ((lambda (p
  638.                                                                                          y)
  639.                                                                                    (append
  640.                                                                                       (ordlist
  641.                                                                                          p)
  642.                                                                                       (quasi
  643.                                                                                          y)))
  644.                                                                                 (cadar
  645.                                                                                    p)
  646.                                                                                 (cdr p)))
  647.                                                                            (if (and (pair?
  648.                                                                                        (cdr p))
  649.                                                                                     (dot-dot-k?
  650.                                                                                        (cadr p))
  651.                                                                                     (null?
  652.                                                                                        (cddr p)))
  653.                                                                                ((lambda (p
  654.                                                                                          ddk)
  655.                                                                                    `(,(quasi
  656.                                                                                          p)
  657.                                                                                        ,ddk))
  658.                                                                                 (car p)
  659.                                                                                 (cadr p))
  660.                                                                                (g193 (car p)
  661.                                                                                      (cdr p)))))
  662.                                                                    (if (vector?
  663.                                                                           p)
  664.                                                                        ((lambda (p)
  665.                                                                            (let* ((pl (vector->list
  666.                                                                                          p))
  667.                                                                                   (rpl (reverse
  668.                                                                                           pl)))
  669.                                                                               (apply
  670.                                                                                  vector
  671.                                                                                  (if (dot-dot-k?
  672.                                                                                         (car rpl))
  673.                                                                                      (reverse
  674.                                                                                         (cons (car rpl)
  675.                                                                                               (map quasi
  676.                                                                                                    (cdr rpl))))
  677.                                                                                      (map ordinary
  678.                                                                                           pl)))))
  679.                                                                         p)
  680.                                                                        ((lambda ()
  681.                                                                            (match:syntax-err
  682.                                                                               pattern
  683.                                                                               "syntax error in pattern"))))))))))
  684.                                           (ordlist (lambda (p)
  685.                                                       (cond
  686.                                                          ((null? p) '())
  687.                                                          ((pair? p) (cons (ordinary
  688.                                                                              (car p))
  689.                                                                           (ordlist
  690.                                                                              (cdr p))))
  691.                                                          (else (match:syntax-err
  692.                                                                   pattern
  693.                                                                   "invalid use of unquote-splicing in pattern"))))))
  694.                                     (ordinary pattern))))
  695.             (bound (lambda (pattern)
  696.                       (letrec ((pred-bodies '())
  697.                                (bound (lambda (p a k)
  698.                                          (cond
  699.                                             ((eq? '_ p) (k p a))
  700.                                             ((symbol? p) (if (memq p a)
  701.                                                              (match:syntax-err
  702.                                                                 pattern
  703.                                                                 "duplicate variable in pattern"))
  704.                                              (k p (cons p a)))
  705.                                             ((and (pair? p)
  706.                                                   (eq? 'quote (car p))) (k p
  707.                                                                            a))
  708.                                             ((and (pair? p)
  709.                                                   (eq? '? (car p))) (cond
  710.                                                                        ((not (null?
  711.                                                                                 (cddr p))) (bound
  712.                                                                                               `(and (? ,(cadr p))
  713.                                                                                                     ,@(cddr p))
  714.                                                                                               a
  715.                                                                                               k))
  716.                                                                        ((or (not (symbol?
  717.                                                                                     (cadr p)))
  718.                                                                             (memq (cadr p)
  719.                                                                                   a)) (let ((g (gentemp)))
  720.                                                                                          (set! pred-bodies
  721.                                                                                             (cons `(,g ,(cadr p))
  722.                                                                                                   pred-bodies))
  723.                                                                                          (k `(? ,g)
  724.                                                                                             a)))
  725.                                                                        (else (k p
  726.                                                                                 a))))
  727.                                             ((and (pair? p)
  728.                                                   (eq? 'and (car p))) (bound*
  729.                                                                          (cdr p)
  730.                                                                          a
  731.                                                                          (lambda (p
  732.                                                                                   a)
  733.                                                                             (k `(and ,@p)
  734.                                                                                a))))
  735.                                             ((and (pair? p)
  736.                                                   (eq? 'or (car p))) (bound
  737.                                                                         (cadr p)
  738.                                                                         a
  739.                                                                         (lambda (first-p
  740.                                                                                  first-a)
  741.                                                                            (let or* ((plist (cddr p))
  742.                                                                                      (k (lambda (plist)
  743.                                                                                            (k `(or ,first-p
  744.                                                                                                    ,@plist)
  745.                                                                                               first-a))))
  746.                                                                               (if (null?
  747.                                                                                      plist)
  748.                                                                                   (k plist)
  749.                                                                                   (bound
  750.                                                                                      (car plist)
  751.                                                                                      a
  752.                                                                                      (lambda (car-p
  753.                                                                                               car-a)
  754.                                                                                         (if (not (permutation
  755.                                                                                                     car-a
  756.                                                                                                     first-a))
  757.                                                                                             (match:syntax-err
  758.                                                                                                pattern
  759.                                                                                                "variables of or-pattern differ in"))
  760.                                                                                         (or* (cdr plist)
  761.                                                                                              (lambda (cdr-p)
  762.                                                                                                 (k (cons car-p
  763.                                                                                                          cdr-p)))))))))))
  764.                                             ((and (pair? p)
  765.                                                   (eq? 'not (car p))) (cond
  766.                                                                          ((not (null?
  767.                                                                                   (cddr p))) (bound
  768.                                                                                                 `(not (or ,@(cdr p)))
  769.                                                                                                 a
  770.                                                                                                 k))
  771.                                                                          (else (bound
  772.                                                                                   (cadr p)
  773.                                                                                   a
  774.                                                                                   (lambda (p2
  775.                                                                                            a2)
  776.                                                                                      (if (not (permutation
  777.                                                                                                  a
  778.                                                                                                  a2))
  779.                                                                                          (match:syntax-err
  780.                                                                                             p
  781.                                                                                             "no variables allowed in"))
  782.                                                                                      (k `(not ,p2)
  783.                                                                                         a))))))
  784.                                             ((and (pair? p)
  785.                                                   (pair? (cdr p))
  786.                                                   (dot-dot-k? (cadr p))) (bound
  787.                                                                             (car p)
  788.                                                                             a
  789.                                                                             (lambda (q
  790.                                                                                      b)
  791.                                                                                (let ((bvars (find-prefix
  792.                                                                                                b
  793.                                                                                                a)))
  794.                                                                                   (k `(,q ,(cadr p)
  795.                                                                                           ,bvars
  796.                                                                                           ,(gentemp)
  797.                                                                                           ,(gentemp)
  798.                                                                                           ,(map (lambda (_)
  799.                                                                                                    (gentemp))
  800.                                                                                                 bvars))
  801.                                                                                      b)))))
  802.                                             ((and (pair? p)
  803.                                                   (eq? '$ (car p))) (bound*
  804.                                                                        (cddr p)
  805.                                                                        a
  806.                                                                        (lambda (p1
  807.                                                                                 a)
  808.                                                                           (k `($ ,(cadr p)
  809.                                                                                  ,@p1)
  810.                                                                              a))))
  811.                                             ((and (pair? p)
  812.                                                   (eq? 'set! (car p))) (if (memq (cadr p)
  813.                                                                                  a)
  814.                                                                            (k p
  815.                                                                               a)
  816.                                                                            (k p
  817.                                                                               (cons (cadr p)
  818.                                                                                     a))))
  819.                                             ((and (pair? p)
  820.                                                   (eq? 'get! (car p))) (if (memq (cadr p)
  821.                                                                                  a)
  822.                                                                            (k p
  823.                                                                               a)
  824.                                                                            (k p
  825.                                                                               (cons (cadr p)
  826.                                                                                     a))))
  827.                                             ((pair? p) (bound
  828.                                                           (car p)
  829.                                                           a
  830.                                                           (lambda (car-p a)
  831.                                                              (bound
  832.                                                                 (cdr p)
  833.                                                                 a
  834.                                                                 (lambda (cdr-p
  835.                                                                          a)
  836.                                                                    (k (cons car-p
  837.                                                                             cdr-p)
  838.                                                                       a))))))
  839.                                             ((vector? p) (boundv
  840.                                                             (vector->list
  841.                                                                p)
  842.                                                             a
  843.                                                             (lambda (pl a)
  844.                                                                (k (list->vector
  845.                                                                      pl)
  846.                                                                   a))))
  847.                                             (else (k p a)))))
  848.                                (boundv (lambda (plist a k)
  849.                                           (let ((g187 (lambda ()
  850.                                                          (k plist a))))
  851.                                              (if (pair? plist)
  852.                                                  (if (and (pair?
  853.                                                              (cdr plist))
  854.                                                           (dot-dot-k?
  855.                                                              (cadr plist))
  856.                                                           (null?
  857.                                                              (cddr plist)))
  858.                                                      ((lambda ()
  859.                                                          (bound
  860.                                                             plist
  861.                                                             a
  862.                                                             k)))
  863.                                                      (if (null? plist)
  864.                                                          (g187)
  865.                                                          ((lambda (x y)
  866.                                                              (bound
  867.                                                                 x
  868.                                                                 a
  869.                                                                 (lambda (car-p
  870.                                                                          a)
  871.                                                                    (boundv
  872.                                                                       y
  873.                                                                       a
  874.                                                                       (lambda (cdr-p
  875.                                                                                a)
  876.                                                                          (k (cons car-p
  877.                                                                                   cdr-p)
  878.                                                                             a))))))
  879.                                                           (car plist)
  880.                                                           (cdr plist))))
  881.                                                  (if (null? plist)
  882.                                                      (g187)
  883.                                                      (match:error
  884.                                                         plist))))))
  885.                                (bound* (lambda (plist a k)
  886.                                           (if (null? plist)
  887.                                               (k plist a)
  888.                                               (bound
  889.                                                  (car plist)
  890.                                                  a
  891.                                                  (lambda (car-p a)
  892.                                                     (bound*
  893.                                                        (cdr plist)
  894.                                                        a
  895.                                                        (lambda (cdr-p a)
  896.                                                           (k (cons car-p
  897.                                                                    cdr-p)
  898.                                                              a))))))))
  899.                                (find-prefix (lambda (b a)
  900.                                                (if (eq? b a)
  901.                                                    '()
  902.                                                    (cons (car b)
  903.                                                          (find-prefix
  904.                                                             (cdr b)
  905.                                                             a)))))
  906.                                (permutation (lambda (p1 p2)
  907.                                                (and (= (length p1)
  908.                                                        (length p2))
  909.                                                     (match:andmap
  910.                                                        (lambda (x1)
  911.                                                           (memq x1 p2))
  912.                                                        p1)))))
  913.                          (bound
  914.                             pattern
  915.                             '()
  916.                             (lambda (p a)
  917.                                (list p (reverse a) pred-bodies))))))
  918.             (inline-let (lambda (let-exp)
  919.                            (letrec ((occ (lambda (x e)
  920.                                             (let loop ((e e))
  921.                                                (cond
  922.                                                   ((pair? e) (+ (loop (car e))
  923.                                                                 (loop (cdr e))))
  924.                                                   ((eq? x e) 1)
  925.                                                   (else 0)))))
  926.                                     (subst (lambda (e old new)
  927.                                               (let loop ((e e))
  928.                                                  (cond
  929.                                                     ((pair? e) (cons (loop (car e))
  930.                                                                      (loop (cdr e))))
  931.                                                     ((eq? old e) new)
  932.                                                     (else e)))))
  933.                                     (const? (lambda (sexp)
  934.                                                (or (symbol? sexp)
  935.                                                    (boolean? sexp)
  936.                                                    (string? sexp)
  937.                                                    (char? sexp)
  938.                                                    (number? sexp)
  939.                                                    (null? sexp)
  940.                                                    (and (pair? sexp)
  941.                                                         (eq? (car sexp)
  942.                                                              'quote)
  943.                                                         (pair? (cdr sexp))
  944.                                                         (symbol?
  945.                                                            (cadr sexp))
  946.                                                         (null?
  947.                                                            (cddr sexp))))))
  948.                                     (isval? (lambda (sexp)
  949.                                                (or (const? sexp)
  950.                                                    (and (pair? sexp)
  951.                                                         (memq (car sexp)
  952.                                                               '(lambda quote
  953.                                                                   match-lambda
  954.                                                                   match-lambda*))))))
  955.                                     (small? (lambda (sexp)
  956.                                                (or (const? sexp)
  957.                                                    (and (pair? sexp)
  958.                                                         (eq? (car sexp)
  959.                                                              'lambda)
  960.                                                         (pair? (cdr sexp))
  961.                                                         (pair? (cddr sexp))
  962.                                                         (const?
  963.                                                            (caddr sexp))
  964.                                                         (null?
  965.                                                            (cdddr sexp)))))))
  966.                               (let loop ((b (cadr let-exp))
  967.                                          (new-b '())
  968.                                          (e (caddr let-exp)))
  969.                                  (cond
  970.                                     ((null? b) (if (null? new-b)
  971.                                                    e
  972.                                                    `(let ,(reverse new-b)
  973.                                                        ,e)))
  974.                                     ((isval? (cadr (car b))) (let* ((x (caar b))
  975.                                                                     (n (occ x
  976.                                                                             e)))
  977.                                                                 (cond
  978.                                                                    ((= 0 n) (loop (cdr b)
  979.                                                                                   new-b
  980.                                                                                   e))
  981.                                                                    ((or (= 1
  982.                                                                            n)
  983.                                                                         (small?
  984.                                                                            (cadr (car b)))) (loop (cdr b)
  985.                                                                                                   new-b
  986.                                                                                                   (subst
  987.                                                                                                      e
  988.                                                                                                      x
  989.                                                                                                      (cadr (car b)))))
  990.                                                                    (else (loop (cdr b)
  991.                                                                                (cons (car b)
  992.                                                                                      new-b)
  993.                                                                                e)))))
  994.                                     (else (loop (cdr b)
  995.                                                 (cons (car b) new-b)
  996.                                                 e)))))))
  997.             (gen (lambda (x sf plist erract length>= eta)
  998.                     (if (null? plist)
  999.                         (erract x)
  1000.                         (let* ((v '())
  1001.                                (val (lambda (x) (cdr (assq x v))))
  1002.                                (fail (lambda (sf)
  1003.                                         (gen x
  1004.                                              sf
  1005.                                              (cdr plist)
  1006.                                              erract
  1007.                                              length>=
  1008.                                              eta)))
  1009.                                (success (lambda (sf)
  1010.                                            (set-car!
  1011.                                               (cddddr (car plist))
  1012.                                               #t)
  1013.                                            (let* ((code (cadr (car plist)))
  1014.                                                   (bv (caddr (car plist)))
  1015.                                                   (fail-sym (cadddr
  1016.                                                                (car plist))))
  1017.                                               (if fail-sym
  1018.                                                   (let ((ap `(,code
  1019.                                                                 ,fail-sym
  1020.                                                                 ,@(map val
  1021.                                                                        bv))))
  1022.                                                      `(call-with-current-continuation
  1023.                                                          (lambda (,fail-sym)
  1024.                                                             (let ((,fail-sym (lambda ()
  1025.                                                                                 (,fail-sym
  1026.                                                                                    ,(fail sf)))))
  1027.                                                                ,ap))))
  1028.                                                   `(,code
  1029.                                                       ,@(map val bv)))))))
  1030.                            (let next ((p (caar plist))
  1031.                                       (e x)
  1032.                                       (sf sf)
  1033.                                       (kf fail)
  1034.                                       (ks success))
  1035.                               (cond
  1036.                                  ((eq? '_ p) (ks sf))
  1037.                                  ((symbol? p) (set! v (cons (cons p e) v))
  1038.                                   (ks sf))
  1039.                                  ((null? p) (emit `(null? ,e) sf kf ks))
  1040.                                  ((string? p) (emit `(equal? ,e ,p)
  1041.                                                     sf
  1042.                                                     kf
  1043.                                                     ks))
  1044.                                  ((boolean? p) (emit `(equal? ,e ,p)
  1045.                                                      sf
  1046.                                                      kf
  1047.                                                      ks))
  1048.                                  ((char? p) (emit `(equal? ,e ,p) sf kf ks))
  1049.                                  ((number? p) (emit `(equal? ,e ,p)
  1050.                                                     sf
  1051.                                                     kf
  1052.                                                     ks))
  1053.                                  ((and (pair? p) (eq? 'quote (car p))) (emit `(equal?
  1054.                                                                                  ,e
  1055.                                                                                  ,p)
  1056.                                                                              sf
  1057.                                                                              kf
  1058.                                                                              ks))
  1059.                                  ((and (pair? p) (eq? '? (car p))) (let ((tst `(,(cadr p)
  1060.                                                                                   ,e)))
  1061.                                                                       (emit tst
  1062.                                                                             sf
  1063.                                                                             kf
  1064.                                                                             ks)))
  1065.                                  ((and (pair? p) (eq? 'and (car p))) (let loop ((p (cdr p))
  1066.                                                                                 (sf sf))
  1067.                                                                         (if (null?
  1068.                                                                                p)
  1069.                                                                             (ks sf)
  1070.                                                                             (next (car p)
  1071.                                                                                   e
  1072.                                                                                   sf
  1073.                                                                                   kf
  1074.                                                                                   (lambda (sf)
  1075.                                                                                      (loop (cdr p)
  1076.                                                                                            sf))))))
  1077.                                  ((and (pair? p) (eq? 'or (car p))) (let ((or-v v))
  1078.                                                                        (let loop ((p (cdr p))
  1079.                                                                                   (sf sf))
  1080.                                                                           (if (null?
  1081.                                                                                  p)
  1082.                                                                               (kf sf)
  1083.                                                                               (begin (set! v
  1084.                                                                                         or-v)
  1085.                                                                                      (next (car p)
  1086.                                                                                            e
  1087.                                                                                            sf
  1088.                                                                                            (lambda (sf)
  1089.                                                                                               (loop (cdr p)
  1090.                                                                                                     sf))
  1091.                                                                                            ks))))))
  1092.                                  ((and (pair? p) (eq? 'not (car p))) (next (cadr p)
  1093.                                                                            e
  1094.                                                                            sf
  1095.                                                                            ks
  1096.                                                                            kf))
  1097.                                  ((and (pair? p) (eq? '$ (car p))) (let* ((tag (cadr p))
  1098.                                                                           (fields (cdr p))
  1099.                                                                           (rlen (length
  1100.                                                                                    fields))
  1101.                                                                           (tst `(,(symbol-append
  1102.                                                                                      tag
  1103.                                                                                      '?)
  1104.                                                                                    ,e)))
  1105.                                                                       (emit tst
  1106.                                                                             sf
  1107.                                                                             kf
  1108.                                                                             (let rloop ((n 1))
  1109.                                                                                (lambda (sf)
  1110.                                                                                   (if (= n
  1111.                                                                                          rlen)
  1112.                                                                                       (ks sf)
  1113.                                                                                       (next (list-ref
  1114.                                                                                                fields
  1115.                                                                                                n)
  1116.                                                                                             `(,(symbol-append
  1117.                                                                                                   tag
  1118.                                                                                                   '-
  1119.                                                                                                   n)
  1120.                                                                                                 ,e)
  1121.                                                                                             sf
  1122.                                                                                             kf
  1123.                                                                                             (rloop
  1124.                                                                                                (+ 1
  1125.                                                                                                   n)))))))))
  1126.                                  ((and (pair? p) (eq? 'set! (car p))) (set! v
  1127.                                                                          (cons (cons (cadr p)
  1128.                                                                                      (setter
  1129.                                                                                         e
  1130.                                                                                         p))
  1131.                                                                                v))
  1132.                                   (ks sf))
  1133.                                  ((and (pair? p) (eq? 'get! (car p))) (set! v
  1134.                                                                          (cons (cons (cadr p)
  1135.                                                                                      (getter
  1136.                                                                                         e
  1137.                                                                                         p))
  1138.                                                                                v))
  1139.                                   (ks sf))
  1140.                                  ((and (pair? p)
  1141.                                        (pair? (cdr p))
  1142.                                        (dot-dot-k? (cadr p))) (emit `(list?
  1143.                                                                         ,e)
  1144.                                                                     sf
  1145.                                                                     kf
  1146.                                                                     (lambda (sf)
  1147.                                                                        (let* ((k (dot-dot-k?
  1148.                                                                                     (cadr p)))
  1149.                                                                               (ks (lambda (sf)
  1150.                                                                                      (let ((bound (list-ref
  1151.                                                                                                      p
  1152.                                                                                                      2)))
  1153.                                                                                         (cond
  1154.                                                                                            ((eq? (car p)
  1155.                                                                                                  '_) (ks sf))
  1156.                                                                                            ((null?
  1157.                                                                                                bound) (let* ((ptst (next (car p)
  1158.                                                                                                                          eta
  1159.                                                                                                                          sf
  1160.                                                                                                                          (lambda (sf)
  1161.                                                                                                                             #f)
  1162.                                                                                                                          (lambda (sf)
  1163.                                                                                                                             #t)))
  1164.                                                                                                              (tst (if (and (pair?
  1165.                                                                                                                               ptst)
  1166.                                                                                                                            (symbol?
  1167.                                                                                                                               (car ptst))
  1168.                                                                                                                            (pair?
  1169.                                                                                                                               (cdr ptst))
  1170.                                                                                                                            (eq? eta
  1171.                                                                                                                                 (cadr ptst))
  1172.                                                                                                                            (null?
  1173.                                                                                                                               (cddr ptst)))
  1174.                                                                                                                       (car ptst)
  1175.                                                                                                                       `(lambda (,eta)
  1176.                                                                                                                           ,ptst))))
  1177.                                                                                                          (assm `(match:andmap
  1178.                                                                                                                    ,tst
  1179.                                                                                                                    ,e)
  1180.                                                                                                                (kf sf)
  1181.                                                                                                                (ks sf))))
  1182.                                                                                            ((and (symbol?
  1183.                                                                                                     (car p))
  1184.                                                                                                  (equal?
  1185.                                                                                                     (list (car p))
  1186.                                                                                                     bound)) (next (car p)
  1187.                                                                                                                   e
  1188.                                                                                                                   sf
  1189.                                                                                                                   kf
  1190.                                                                                                                   ks))
  1191.                                                                                            (else (let* ((gloop (list-ref
  1192.                                                                                                                   p
  1193.                                                                                                                   3))
  1194.                                                                                                         (ge (list-ref
  1195.                                                                                                                p
  1196.                                                                                                                4))
  1197.                                                                                                         (fresh (list-ref
  1198.                                                                                                                   p
  1199.                                                                                                                   5))
  1200.                                                                                                         (p1 (next (car p)
  1201.                                                                                                                   `(car ,ge)
  1202.                                                                                                                   sf
  1203.                                                                                                                   kf
  1204.                                                                                                                   (lambda (sf)
  1205.                                                                                                                      `(,gloop
  1206.                                                                                                                          (cdr ,ge)
  1207.                                                                                                                          ,@(map (lambda (b
  1208.                                                                                                                                          f)
  1209.                                                                                                                                    `(cons ,(val b)
  1210.                                                                                                                                           ,f))
  1211.                                                                                                                                 bound
  1212.                                                                                                                                 fresh))))))
  1213.                                                                                                     (set! v
  1214.                                                                                                        (append
  1215.                                                                                                           (map cons
  1216.                                                                                                                bound
  1217.                                                                                                                (map (lambda (x)
  1218.                                                                                                                        `(reverse
  1219.                                                                                                                            ,x))
  1220.                                                                                                                     fresh))
  1221.                                                                                                           v))
  1222.                                                                                                     `(let ,gloop
  1223.                                                                                                         ((,ge ,e)
  1224.                                                                                                          ,@(map (lambda (x)
  1225.                                                                                                                    `(,x '()))
  1226.                                                                                                                 fresh))
  1227.                                                                                                         (if (null?
  1228.                                                                                                                ,ge)
  1229.                                                                                                             ,(ks sf)
  1230.                                                                                                             ,p1)))))))))
  1231.                                                                           (case k
  1232.                                                                              ((0) (ks sf))
  1233.                                                                              ((1) (emit `(pair?
  1234.                                                                                             ,e)
  1235.                                                                                         sf
  1236.                                                                                         kf
  1237.                                                                                         ks))
  1238.                                                                              (else (emit `((,length>=
  1239.                                                                                               ,k)
  1240.                                                                                            ,e)
  1241.                                                                                          sf
  1242.                                                                                          kf
  1243.                                                                                          ks)))))))
  1244.                                  ((pair? p) (emit `(pair? ,e)
  1245.                                                   sf
  1246.                                                   kf
  1247.                                                   (lambda (sf)
  1248.                                                      (next (car p)
  1249.                                                            (add-a e)
  1250.                                                            sf
  1251.                                                            kf
  1252.                                                            (lambda (sf)
  1253.                                                               (next (cdr p)
  1254.                                                                     (add-d
  1255.                                                                        e)
  1256.                                                                     sf
  1257.                                                                     kf
  1258.                                                                     ks))))))
  1259.                                  ((and (vector? p)
  1260.                                        (>= (vector-length p) 6)
  1261.                                        (dot-dot-k?
  1262.                                           (vector-ref
  1263.                                              p
  1264.                                              (- (vector-length p) 5)))) (let* ((vlen (- (vector-length
  1265.                                                                                            p)
  1266.                                                                                         6))
  1267.                                                                                (k (dot-dot-k?
  1268.                                                                                      (vector-ref
  1269.                                                                                         p
  1270.                                                                                         (+ vlen
  1271.                                                                                            1))))
  1272.                                                                                (minlen (+ vlen
  1273.                                                                                           k))
  1274.                                                                                (bound (vector-ref
  1275.                                                                                          p
  1276.                                                                                          (+ vlen
  1277.                                                                                             2))))
  1278.                                                                            (emit `(vector?
  1279.                                                                                      ,e)
  1280.                                                                                  sf
  1281.                                                                                  kf
  1282.                                                                                  (lambda (sf)
  1283.                                                                                     (assm `(>= (vector-length
  1284.                                                                                                   ,e)
  1285.                                                                                                ,minlen)
  1286.                                                                                           (kf sf)
  1287.                                                                                           ((let vloop ((n 0))
  1288.                                                                                               (lambda (sf)
  1289.                                                                                                  (cond
  1290.                                                                                                     ((not (= n
  1291.                                                                                                              vlen)) (next (vector-ref
  1292.                                                                                                                              p
  1293.                                                                                                                              n)
  1294.                                                                                                                           `(vector-ref
  1295.                                                                                                                               ,e
  1296.                                                                                                                               ,n)
  1297.                                                                                                                           sf
  1298.                                                                                                                           kf
  1299.                                                                                                                           (vloop
  1300.                                                                                                                              (+ 1
  1301.                                                                                                                                 n))))
  1302.                                                                                                     ((eq? (vector-ref
  1303.                                                                                                              p
  1304.                                                                                                              vlen)
  1305.                                                                                                           '_) (ks sf))
  1306.                                                                                                     (else (let* ((gloop (vector-ref
  1307.                                                                                                                            p
  1308.                                                                                                                            (+ vlen
  1309.                                                                                                                               3)))
  1310.                                                                                                                  (ind (vector-ref
  1311.                                                                                                                          p
  1312.                                                                                                                          (+ vlen
  1313.                                                                                                                             4)))
  1314.                                                                                                                  (fresh (vector-ref
  1315.                                                                                                                            p
  1316.                                                                                                                            (+ vlen
  1317.                                                                                                                               5)))
  1318.                                                                                                                  (p1 (next (vector-ref
  1319.                                                                                                                               p
  1320.                                                                                                                               vlen)
  1321.                                                                                                                            `(vector-ref
  1322.                                                                                                                                ,e
  1323.                                                                                                                                ,ind)
  1324.                                                                                                                            sf
  1325.                                                                                                                            kf
  1326.                                                                                                                            (lambda (sf)
  1327.                                                                                                                               `(,gloop
  1328.                                                                                                                                   (- ,ind
  1329.                                                                                                                                      1)
  1330.                                                                                                                                   ,@(map (lambda (b
  1331.                                                                                                                                                   f)
  1332.                                                                                                                                             `(cons ,(val b)
  1333.                                                                                                                                                    ,f))
  1334.                                                                                                                                          bound
  1335.                                                                                                                                          fresh))))))
  1336.                                                                                                              (set! v
  1337.                                                                                                                 (append
  1338.                                                                                                                    (map cons
  1339.                                                                                                                         bound
  1340.                                                                                                                         fresh)
  1341.                                                                                                                    v))
  1342.                                                                                                              `(let ,gloop
  1343.                                                                                                                  ((,ind (- (vector-length
  1344.                                                                                                                               ,e)
  1345.                                                                                                                            1))
  1346.                                                                                                                   ,@(map (lambda (x)
  1347.                                                                                                                             `(,x '()))
  1348.                                                                                                                          fresh))
  1349.                                                                                                                  (if (> ,minlen
  1350.                                                                                                                         ,ind)
  1351.                                                                                                                      ,(ks sf)
  1352.                                                                                                                      ,p1)))))))
  1353.                                                                                            sf))))))
  1354.                                  ((vector? p) (let ((vlen (vector-length p)))
  1355.                                                  (emit `(vector? ,e)
  1356.                                                        sf
  1357.                                                        kf
  1358.                                                        (lambda (sf)
  1359.                                                           (emit `(equal?
  1360.                                                                     (vector-length
  1361.                                                                        ,e)
  1362.                                                                     ,vlen)
  1363.                                                                 sf
  1364.                                                                 kf
  1365.                                                                 (let vloop ((n 0))
  1366.                                                                    (lambda (sf)
  1367.                                                                       (if (= n
  1368.                                                                              vlen)
  1369.                                                                           (ks sf)
  1370.                                                                           (next (vector-ref
  1371.                                                                                    p
  1372.                                                                                    n)
  1373.                                                                                 `(vector-ref
  1374.                                                                                     ,e
  1375.                                                                                     ,n)
  1376.                                                                                 sf
  1377.                                                                                 kf
  1378.                                                                                 (vloop
  1379.                                                                                    (+ 1
  1380.                                                                                       n)))))))))))
  1381.                                  (else (display
  1382.                                           "FATAL ERROR IN PATTERN MATCHER")
  1383.                                   (newline)
  1384.                                   (error #f "THIS NEVER HAPPENS"))))))))
  1385.             (emit (lambda (tst sf kf ks)
  1386.                      (cond
  1387.                         ((in tst sf) (ks sf))
  1388.                         ((in `(not ,tst) sf) (kf sf))
  1389.                         (else (let* ((e (cadr tst))
  1390.                                      (implied (cond
  1391.                                                  ((eq? (car tst) 'equal?) (let ((p (caddr
  1392.                                                                                       tst)))
  1393.                                                                              (cond
  1394.                                                                                 ((string?
  1395.                                                                                     p) `((string?
  1396.                                                                                             ,e)))
  1397.                                                                                 ((boolean?
  1398.                                                                                     p) `((boolean?
  1399.                                                                                             ,e)))
  1400.                                                                                 ((char?
  1401.                                                                                     p) `((char?
  1402.                                                                                             ,e)))
  1403.                                                                                 ((number?
  1404.                                                                                     p) `((number?
  1405.                                                                                             ,e)))
  1406.                                                                                 ((and (pair?
  1407.                                                                                          p)
  1408.                                                                                       (eq? 'quote
  1409.                                                                                            (car p))) `((symbol?
  1410.                                                                                                           ,e)))
  1411.                                                                                 (else '()))))
  1412.                                                  ((eq? (car tst) 'null?) `((list?
  1413.                                                                               ,e)))
  1414.                                                  ((vec-structure? tst) `((vector?
  1415.                                                                             ,e)))
  1416.                                                  (else '())))
  1417.                                      (not-imp (case (car tst)
  1418.                                                  ((list?) `((not (null?
  1419.                                                                     ,e))))
  1420.                                                  (else '())))
  1421.                                      (s (ks (cons tst (append implied sf))))
  1422.                                      (k (kf (cons `(not ,tst)
  1423.                                                   (append not-imp sf)))))
  1424.                                  (assm tst k s))))))
  1425.             (assm (lambda (tst f s)
  1426.                      (cond
  1427.                         ((equal? s f) s)
  1428.                         ((and (eq? s #t) (eq? f #f)) tst)
  1429.                         ((and (eq? (car tst) 'pair?)
  1430.                               (memq match:error-control
  1431.                                     '(unspecified fail))
  1432.                               (memq (car f) '(cond match:error))
  1433.                               (guarantees s (cadr tst))) s)
  1434.                         ((and (pair? s)
  1435.                               (eq? (car s) 'if)
  1436.                               (equal? (cadddr s) f)) (if (eq? (car (cadr s))
  1437.                                                               'and)
  1438.                                                          `(if (and ,tst
  1439.                                                                    ,@(cdr (cadr s)))
  1440.                                                               ,(caddr s)
  1441.                                                               ,f)
  1442.                                                          `(if (and ,tst
  1443.                                                                    ,(cadr s))
  1444.                                                               ,(caddr s)
  1445.                                                               ,f)))
  1446.                         ((and (pair? s)
  1447.                               (equal?
  1448.                                  (car s)
  1449.                                  'call-with-current-continuation)
  1450.                               (pair? (cdr s))
  1451.                               (pair? (cadr s))
  1452.                               (equal? (caadr s) 'lambda)
  1453.                               (pair? (cdadr s))
  1454.                               (pair? (cadadr s))
  1455.                               (null? (cdr (cadadr s)))
  1456.                               (pair? (cddadr s))
  1457.                               (pair? (car (cddadr s)))
  1458.                               (equal? (caar (cddadr s)) 'let)
  1459.                               (pair? (cdar (cddadr s)))
  1460.                               (pair? (cadar (cddadr s)))
  1461.                               (pair? (caadar (cddadr s)))
  1462.                               (pair? (cdr (caadar (cddadr s))))
  1463.                               (pair? (cadr (caadar (cddadr s))))
  1464.                               (equal? (caadr (caadar (cddadr s))) 'lambda)
  1465.                               (pair? (cdadr (caadar (cddadr s))))
  1466.                               (null? (cadadr (caadar (cddadr s))))
  1467.                               (pair? (cddadr (caadar (cddadr s))))
  1468.                               (pair? (car (cddadr (caadar (cddadr s)))))
  1469.                               (pair? (cdar (cddadr (caadar (cddadr s)))))
  1470.                               (null? (cddar (cddadr (caadar (cddadr s)))))
  1471.                               (null? (cdr (cddadr (caadar (cddadr s)))))
  1472.                               (null? (cddr (caadar (cddadr s))))
  1473.                               (null? (cdadar (cddadr s)))
  1474.                               (pair? (cddar (cddadr s)))
  1475.                               (null? (cdddar (cddadr s)))
  1476.                               (null? (cdr (cddadr s)))
  1477.                               (null? (cddr s))
  1478.                               (equal?
  1479.                                  f
  1480.                                  (cadar (cddadr (caadar (cddadr s)))))) (let ((k (car (cadadr
  1481.                                                                                          s)))
  1482.                                                                               (fail (car (caadar
  1483.                                                                                             (cddadr
  1484.                                                                                                s))))
  1485.                                                                               (s2 (caddar
  1486.                                                                                      (cddadr
  1487.                                                                                         s))))
  1488.                                                                            `(call-with-current-continuation
  1489.                                                                                (lambda (,k)
  1490.                                                                                   (let ((,fail (lambda ()
  1491.                                                                                                   (,k ,f))))
  1492.                                                                                      ,(assm tst
  1493.                                                                                             `(,fail)
  1494.                                                                                             s2))))))
  1495.                         ((and #f
  1496.                               (pair? s)
  1497.                               (equal? (car s) 'let)
  1498.                               (pair? (cdr s))
  1499.                               (pair? (cadr s))
  1500.                               (pair? (caadr s))
  1501.                               (pair? (cdaadr s))
  1502.                               (pair? (car (cdaadr s)))
  1503.                               (equal? (caar (cdaadr s)) 'lambda)
  1504.                               (pair? (cdar (cdaadr s)))
  1505.                               (null? (cadar (cdaadr s)))
  1506.                               (pair? (cddar (cdaadr s)))
  1507.                               (null? (cdddar (cdaadr s)))
  1508.                               (null? (cdr (cdaadr s)))
  1509.                               (null? (cdadr s))
  1510.                               (pair? (cddr s))
  1511.                               (null? (cdddr s))
  1512.                               (equal? (caddar (cdaadr s)) f)) (let ((fail (caaadr
  1513.                                                                              s))
  1514.                                                                     (s2 (caddr
  1515.                                                                            s)))
  1516.                                                                  `(let ((,fail (lambda ()
  1517.                                                                                   ,f)))
  1518.                                                                      ,(assm tst
  1519.                                                                             `(,fail)
  1520.                                                                             s2))))
  1521.                         (else `(if ,tst ,s ,f)))))
  1522.             (guarantees (lambda (code x)
  1523.                            (let ((a (add-a x)) (d (add-d x)))
  1524.                               (let loop ((code code))
  1525.                                  (cond
  1526.                                     ((not (pair? code)) #f)
  1527.                                     ((memq (car code) '(cond match:error)) #t)
  1528.                                     ((or (equal? code a) (equal? code d)) #t)
  1529.                                     ((eq? (car code) 'if) (or (loop (cadr code))
  1530.                                                               (and (loop (caddr
  1531.                                                                             code))
  1532.                                                                    (loop (cadddr
  1533.                                                                             code)))))
  1534.                                     ((eq? (car code) 'lambda) #f)
  1535.                                     ((and (eq? (car code) 'let)
  1536.                                           (symbol? (cadr code))) #f)
  1537.                                     (else (or (loop (car code))
  1538.                                               (loop (cdr code)))))))))
  1539.             (in (lambda (e l)
  1540.                    (or (member e l)
  1541.                        (and (eq? (car e) 'list?)
  1542.                             (or (member `(null? ,(cadr e)) l)
  1543.                                 (member `(pair? ,(cadr e)) l)))
  1544.                        (and (eq? (car e) 'not)
  1545.                             (let* ((srch (cadr e))
  1546.                                    (const-class (equal-test? srch)))
  1547.                                (cond
  1548.                                   (const-class (let mem ((l l))
  1549.                                                   (if (null? l)
  1550.                                                       #f
  1551.                                                       (let ((x (car l)))
  1552.                                                          (or (and (equal?
  1553.                                                                      (cadr x)
  1554.                                                                      (cadr srch))
  1555.                                                                   (disjoint?
  1556.                                                                      x)
  1557.                                                                   (not (equal?
  1558.                                                                           const-class
  1559.                                                                           (car x))))
  1560.                                                              (equal?
  1561.                                                                 x
  1562.                                                                 `(not (,const-class
  1563.                                                                          ,(cadr srch))))
  1564.                                                              (and (equal?
  1565.                                                                      (cadr x)
  1566.                                                                      (cadr srch))
  1567.                                                                   (equal-test?
  1568.                                                                      x)
  1569.                                                                   (not (equal?
  1570.                                                                           (caddr
  1571.                                                                              srch)
  1572.                                                                           (caddr
  1573.                                                                              x))))
  1574.                                                              (mem (cdr l)))))))
  1575.                                   ((disjoint? srch) (let mem ((l l))
  1576.                                                        (if (null? l)
  1577.                                                            #f
  1578.                                                            (let ((x (car l)))
  1579.                                                               (or (and (equal?
  1580.                                                                           (cadr x)
  1581.                                                                           (cadr srch))
  1582.                                                                        (disjoint?
  1583.                                                                           x)
  1584.                                                                        (not (equal?
  1585.                                                                                (car x)
  1586.                                                                                (car srch))))
  1587.                                                                   (mem (cdr l)))))))
  1588.                                   ((eq? (car srch) 'list?) (let mem ((l l))
  1589.                                                               (if (null? l)
  1590.                                                                   #f
  1591.                                                                   (let ((x (car l)))
  1592.                                                                      (or (and (equal?
  1593.                                                                                  (cadr x)
  1594.                                                                                  (cadr srch))
  1595.                                                                               (disjoint?
  1596.                                                                                  x)
  1597.                                                                               (not (memq (car x)
  1598.                                                                                          '(list?
  1599.                                                                                              pair?
  1600.                                                                                              null?))))
  1601.                                                                          (mem (cdr l)))))))
  1602.                                   ((vec-structure? srch) (let mem ((l l))
  1603.                                                             (if (null? l)
  1604.                                                                 #f
  1605.                                                                 (let ((x (car l)))
  1606.                                                                    (or (and (equal?
  1607.                                                                                (cadr x)
  1608.                                                                                (cadr srch))
  1609.                                                                             (or (disjoint?
  1610.                                                                                    x)
  1611.                                                                                 (vec-structure?
  1612.                                                                                    x))
  1613.                                                                             (not (equal?
  1614.                                                                                     (car x)
  1615.                                                                                     'vector?))
  1616.                                                                             (not (equal?
  1617.                                                                                     (car x)
  1618.                                                                                     (car srch))))
  1619.                                                                        (equal?
  1620.                                                                           x
  1621.                                                                           `(not (vector?
  1622.                                                                                    ,(cadr srch))))
  1623.                                                                        (mem (cdr l)))))))
  1624.                                   (else #f)))))))
  1625.             (equal-test? (lambda (tst)
  1626.                             (and (eq? (car tst) 'equal?)
  1627.                                  (let ((p (caddr tst)))
  1628.                                     (cond
  1629.                                        ((string? p) 'string?)
  1630.                                        ((boolean? p) 'boolean?)
  1631.                                        ((char? p) 'char?)
  1632.                                        ((number? p) 'number?)
  1633.                                        ((and (pair? p)
  1634.                                              (pair? (cdr p))
  1635.                                              (null? (cddr p))
  1636.                                              (eq? 'quote (car p))
  1637.                                              (symbol? (cadr p))) 'symbol?)
  1638.                                        (else #f))))))
  1639.             (disjoint? (lambda (tst)
  1640.                           (memq (car tst) match:disjoint-predicates)))
  1641.             (vec-structure? (lambda (tst)
  1642.                                (memq (car tst) match:vector-structures)))
  1643.             (add-a (lambda (a)
  1644.                       (let ((new (and (pair? a) (assq (car a) c---rs))))
  1645.                          (if new (cons (cadr new) (cdr a)) `(car ,a)))))
  1646.             (add-d (lambda (a)
  1647.                       (let ((new (and (pair? a) (assq (car a) c---rs))))
  1648.                          (if new (cons (cddr new) (cdr a)) `(cdr ,a)))))
  1649.             (c---rs '((car caar . cdar)
  1650.                       (cdr cadr . cddr)
  1651.                       (caar caaar . cdaar)
  1652.                       (cadr caadr . cdadr)
  1653.                       (cdar cadar . cddar)
  1654.                       (cddr caddr . cdddr)
  1655.                       (caaar caaaar . cdaaar)
  1656.                       (caadr caaadr . cdaadr)
  1657.                       (cadar caadar . cdadar)
  1658.                       (caddr caaddr . cdaddr)
  1659.                       (cdaar cadaar . cddaar)
  1660.                       (cdadr cadadr . cddadr)
  1661.                       (cddar caddar . cdddar)
  1662.                       (cdddr cadddr . cddddr)))
  1663.             (setter (lambda (e p)
  1664.                        (let ((mk-setter (lambda (s)
  1665.                                            (symbol-append 'set- s '!))))
  1666.                           (cond
  1667.                              ((not (pair? e)) (match:syntax-err
  1668.                                                  p
  1669.                                                  "unnested set! pattern"))
  1670.                              ((eq? (car e) 'vector-ref) `(let ((x ,(cadr e)))
  1671.                                                             (lambda (y)
  1672.                                                                (vector-set!
  1673.                                                                   x
  1674.                                                                   ,(caddr
  1675.                                                                       e)
  1676.                                                                   y))))
  1677.                              ((eq? (car e) 'unbox) `(let ((x ,(cadr e)))
  1678.                                                        (lambda (y)
  1679.                                                           (set-box! x y))))
  1680.                              ((eq? (car e) 'car) `(let ((x ,(cadr e)))
  1681.                                                      (lambda (y)
  1682.                                                         (set-car! x y))))
  1683.                              ((eq? (car e) 'cdr) `(let ((x ,(cadr e)))
  1684.                                                      (lambda (y)
  1685.                                                         (set-cdr! x y))))
  1686.                              ((let ((a (assq (car e) get-c---rs)))
  1687.                                  (and a
  1688.                                       `(let ((x (,(cadr a) ,(cadr e))))
  1689.                                           (lambda (y)
  1690.                                              (,(mk-setter (cddr a))
  1691.                                                 x
  1692.                                                 y))))))
  1693.                              (else `(let ((x ,(cadr e)))
  1694.                                        (lambda (y)
  1695.                                           (,(mk-setter (car e)) x y))))))))
  1696.             (getter (lambda (e p)
  1697.                        (cond
  1698.                           ((not (pair? e)) (match:syntax-err
  1699.                                               p
  1700.                                               "unnested get! pattern"))
  1701.                           ((eq? (car e) 'vector-ref) `(let ((x ,(cadr e)))
  1702.                                                          (lambda ()
  1703.                                                             (vector-ref
  1704.                                                                x
  1705.                                                                ,(caddr
  1706.                                                                    e)))))
  1707.                           ((eq? (car e) 'unbox) `(let ((x ,(cadr e)))
  1708.                                                     (lambda () (unbox x))))
  1709.                           ((eq? (car e) 'car) `(let ((x ,(cadr e)))
  1710.                                                   (lambda () (car x))))
  1711.                           ((eq? (car e) 'cdr) `(let ((x ,(cadr e)))
  1712.                                                   (lambda () (cdr x))))
  1713.                           ((let ((a (assq (car e) get-c---rs)))
  1714.                               (and a
  1715.                                    `(let ((x (,(cadr a) ,(cadr e))))
  1716.                                        (lambda () (,(cddr a) x))))))
  1717.                           (else `(let ((x ,(cadr e)))
  1718.                                     (lambda () (,(car e) x)))))))
  1719.             (get-c---rs '((caar car . car)
  1720.                           (cadr cdr . car)
  1721.                           (cdar car . cdr)
  1722.                           (cddr cdr . cdr)
  1723.                           (caaar caar . car)
  1724.                           (caadr cadr . car)
  1725.                           (cadar cdar . car)
  1726.                           (caddr cddr . car)
  1727.                           (cdaar caar . cdr)
  1728.                           (cdadr cadr . cdr)
  1729.                           (cddar cdar . cdr)
  1730.                           (cdddr cddr . cdr)
  1731.                           (caaaar caaar . car)
  1732.                           (caaadr caadr . car)
  1733.                           (caadar cadar . car)
  1734.                           (caaddr caddr . car)
  1735.                           (cadaar cdaar . car)
  1736.                           (cadadr cdadr . car)
  1737.                           (caddar cddar . car)
  1738.                           (cadddr cdddr . car)
  1739.                           (cdaaar caaar . cdr)
  1740.                           (cdaadr caadr . cdr)
  1741.                           (cdadar cadar . cdr)
  1742.                           (cdaddr caddr . cdr)
  1743.                           (cddaar cdaar . cdr)
  1744.                           (cddadr cdadr . cdr)
  1745.                           (cdddar cddar . cdr)
  1746.                           (cddddr cdddr . cdr)))
  1747.             (symbol-append (lambda l
  1748.                               (string->symbol
  1749.                                  (apply
  1750.                                     string-append
  1751.                                     (map (lambda (x)
  1752.                                             (cond
  1753.                                                ((symbol? x) (symbol->string
  1754.                                                                x))
  1755.                                                ((number? x) (number->string
  1756.                                                                x))
  1757.                                                (else x)))
  1758.                                          l)))))
  1759.             (rac (lambda (l) (if (null? (cdr l)) (car l) (rac (cdr l)))))
  1760.             (rdc (lambda (l)
  1761.                     (if (null? (cdr l)) '() (cons (car l) (rdc (cdr l)))))))
  1762.       (list genmatch genletrec gendefine pattern-var?)))
  1763. (defmacro
  1764.    match
  1765.    args
  1766.    (cond
  1767.       ((and (list? args)
  1768.             (<= 1 (length args))
  1769.             (match:andmap
  1770.                (lambda (y) (and (list? y) (<= 2 (length y))))
  1771.                (cdr args))) (let* ((exp (car args))
  1772.                                    (clauses (cdr args))
  1773.                                    (e (if (symbol? exp) exp (gentemp))))
  1774.                                (if (symbol? exp)
  1775.                                    ((car match:expanders)
  1776.                                     e
  1777.                                     clauses
  1778.                                     `(match ,@args))
  1779.                                    `(let ((,e ,exp))
  1780.                                        ,((car match:expanders)
  1781.                                          e
  1782.                                          clauses
  1783.                                          `(match ,@args))))))
  1784.       (else (match:syntax-err `(match ,@args) "syntax error in"))))
  1785. (defmacro
  1786.    match-lambda
  1787.    args
  1788.    (if (and (list? args)
  1789.             (match:andmap
  1790.                (lambda (g184)
  1791.                   (if (and (pair? g184) (list? (cdr g184)))
  1792.                       (pair? (cdr g184))
  1793.                       #f))
  1794.                args))
  1795.        ((lambda ()
  1796.            (let ((e (gentemp))) `(lambda (,e) (match ,e ,@args)))))
  1797.        ((lambda ()
  1798.            (match:syntax-err
  1799.               `(match-lambda ,@args)
  1800.               "syntax error in")))))
  1801. (defmacro
  1802.    match-lambda*
  1803.    args
  1804.    (if (and (list? args)
  1805.             (match:andmap
  1806.                (lambda (g176)
  1807.                   (if (and (pair? g176) (list? (cdr g176)))
  1808.                       (pair? (cdr g176))
  1809.                       #f))
  1810.                args))
  1811.        ((lambda ()
  1812.            (let ((e (gentemp))) `(lambda ,e (match ,e ,@args)))))
  1813.        ((lambda ()
  1814.            (match:syntax-err
  1815.               `(match-lambda* ,@args)
  1816.               "syntax error in")))))
  1817. (defmacro
  1818.    match-let
  1819.    args
  1820.    (let ((g154 (cadddr match:expanders))
  1821.          (g153 (lambda (pat exp body) `(match ,exp (,pat ,@body))))
  1822.          (g149 (lambda (p1 e1 p2 e2 body)
  1823.                   (let ((g1 (gentemp)) (g2 (gentemp)))
  1824.                      `(let ((,g1 ,e1) (,g2 ,e2))
  1825.                          (match (cons ,g1 ,g2) ((,p1 . ,p2) ,@body))))))
  1826.          (g145 (lambda (pat exp body)
  1827.                   (let ((g (map (lambda (x) (gentemp)) pat))
  1828.                         (vpattern (list->vector pat)))
  1829.                      `(let ,(map list g exp)
  1830.                          (match (vector ,@g) (,vpattern ,@body))))))
  1831.          (g137 (lambda ()
  1832.                   (match:syntax-err `(match-let ,@args) "syntax error in"))))
  1833.       (if (pair? args)
  1834.           (if (symbol? (car args))
  1835.               (if (and (pair? (cdr args)) (list? (cadr args)))
  1836.                   (let g163 ((g162 (cadr args)) (g161 '()) (g160 '()))
  1837.                      (if (null? g162)
  1838.                          (if (and (list? (cddr args)) (pair? (cddr args)))
  1839.                              ((lambda (name pat exp body)
  1840.                                  (if (match:andmap
  1841.                                         (cadddr match:expanders)
  1842.                                         pat)
  1843.                                      `(let ,@args)
  1844.                                      `(letrec ((,name (match-lambda*
  1845.                                                          (,pat ,@body))))
  1846.                                          (,name ,@exp))))
  1847.                               (car args)
  1848.                               (reverse g160)
  1849.                               (reverse g161)
  1850.                               (cddr args))
  1851.                              (g137))
  1852.                          (if (and (pair? (car g162))
  1853.                                   (pair? (cdar g162))
  1854.                                   (null? (cddar g162)))
  1855.                              (g163 (cdr g162)
  1856.                                    (cons (cadar g162) g161)
  1857.                                    (cons (caar g162) g160))
  1858.                              (g137))))
  1859.                   (g137))
  1860.               (if (list? (car args))
  1861.                   (if (match:andmap
  1862.                          (lambda (g168)
  1863.                             (if (and (pair? g168)
  1864.                                      (g154 (car g168))
  1865.                                      (pair? (cdr g168)))
  1866.                                 (null? (cddr g168))
  1867.                                 #f))
  1868.                          (car args))
  1869.                       (if (and (list? (cdr args)) (pair? (cdr args)))
  1870.                           ((lambda () `(let ,@args)))
  1871.                           (let g141 ((g140 (car args))
  1872.                                      (g139 '())
  1873.                                      (g138 '()))
  1874.                              (if (null? g140)
  1875.                                  (g137)
  1876.                                  (if (and (pair? (car g140))
  1877.                                           (pair? (cdar g140))
  1878.                                           (null? (cddar g140)))
  1879.                                      (g141 (cdr g140)
  1880.                                            (cons (cadar g140) g139)
  1881.                                            (cons (caar g140) g138))
  1882.                                      (g137)))))
  1883.                       (if (and (pair? (car args))
  1884.                                (pair? (caar args))
  1885.                                (pair? (cdaar args))
  1886.                                (null? (cddaar args)))
  1887.                           (if (null? (cdar args))
  1888.                               (if (and (list? (cdr args))
  1889.                                        (pair? (cdr args)))
  1890.                                   (g153 (caaar args)
  1891.                                         (cadaar args)
  1892.                                         (cdr args))
  1893.                                   (let g141 ((g140 (car args))
  1894.                                              (g139 '())
  1895.                                              (g138 '()))
  1896.                                      (if (null? g140)
  1897.                                          (g137)
  1898.                                          (if (and (pair? (car g140))
  1899.                                                   (pair? (cdar g140))
  1900.                                                   (null? (cddar g140)))
  1901.                                              (g141 (cdr g140)
  1902.                                                    (cons (cadar g140) g139)
  1903.                                                    (cons (caar g140) g138))
  1904.                                              (g137)))))
  1905.                               (if (and (pair? (cdar args))
  1906.                                        (pair? (cadar args))
  1907.                                        (pair? (cdadar args))
  1908.                                        (null? (cdr (cdadar args)))
  1909.                                        (null? (cddar args)))
  1910.                                   (if (and (list? (cdr args))
  1911.                                            (pair? (cdr args)))
  1912.                                       (g149 (caaar args)
  1913.                                             (cadaar args)
  1914.                                             (caadar args)
  1915.                                             (car (cdadar args))
  1916.                                             (cdr args))
  1917.                                       (let g141 ((g140 (car args))
  1918.                                                  (g139 '())
  1919.                                                  (g138 '()))
  1920.                                          (if (null? g140)
  1921.                                              (g137)
  1922.                                              (if (and (pair? (car g140))
  1923.                                                       (pair? (cdar g140))
  1924.                                                       (null? (cddar g140)))
  1925.                                                  (g141 (cdr g140)
  1926.                                                        (cons (cadar g140)
  1927.                                                              g139)
  1928.                                                        (cons (caar g140)
  1929.                                                              g138))
  1930.                                                  (g137)))))
  1931.                                   (let g141 ((g140 (car args))
  1932.                                              (g139 '())
  1933.                                              (g138 '()))
  1934.                                      (if (null? g140)
  1935.                                          (if (and (list? (cdr args))
  1936.                                                   (pair? (cdr args)))
  1937.                                              (g145 (reverse g138)
  1938.                                                    (reverse g139)
  1939.                                                    (cdr args))
  1940.                                              (g137))
  1941.                                          (if (and (pair? (car g140))
  1942.                                                   (pair? (cdar g140))
  1943.                                                   (null? (cddar g140)))
  1944.                                              (g141 (cdr g140)
  1945.                                                    (cons (cadar g140) g139)
  1946.                                                    (cons (caar g140) g138))
  1947.                                              (g137))))))
  1948.                           (let g141 ((g140 (car args))
  1949.                                      (g139 '())
  1950.                                      (g138 '()))
  1951.                              (if (null? g140)
  1952.                                  (if (and (list? (cdr args))
  1953.                                           (pair? (cdr args)))
  1954.                                      (g145 (reverse g138)
  1955.                                            (reverse g139)
  1956.                                            (cdr args))
  1957.                                      (g137))
  1958.                                  (if (and (pair? (car g140))
  1959.                                           (pair? (cdar g140))
  1960.                                           (null? (cddar g140)))
  1961.                                      (g141 (cdr g140)
  1962.                                            (cons (cadar g140) g139)
  1963.                                            (cons (caar g140) g138))
  1964.                                      (g137))))))
  1965.                   (if (pair? (car args))
  1966.                       (if (and (pair? (caar args))
  1967.                                (pair? (cdaar args))
  1968.                                (null? (cddaar args)))
  1969.                           (if (null? (cdar args))
  1970.                               (if (and (list? (cdr args))
  1971.                                        (pair? (cdr args)))
  1972.                                   (g153 (caaar args)
  1973.                                         (cadaar args)
  1974.                                         (cdr args))
  1975.                                   (let g141 ((g140 (car args))
  1976.                                              (g139 '())
  1977.                                              (g138 '()))
  1978.                                      (if (null? g140)
  1979.                                          (g137)
  1980.                                          (if (and (pair? (car g140))
  1981.                                                   (pair? (cdar g140))
  1982.                                                   (null? (cddar g140)))
  1983.                                              (g141 (cdr g140)
  1984.                                                    (cons (cadar g140) g139)
  1985.                                                    (cons (caar g140) g138))
  1986.                                              (g137)))))
  1987.                               (if (and (pair? (cdar args))
  1988.                                        (pair? (cadar args))
  1989.                                        (pair? (cdadar args))
  1990.                                        (null? (cdr (cdadar args)))
  1991.                                        (null? (cddar args)))
  1992.                                   (if (and (list? (cdr args))
  1993.                                            (pair? (cdr args)))
  1994.                                       (g149 (caaar args)
  1995.                                             (cadaar args)
  1996.                                             (caadar args)
  1997.                                             (car (cdadar args))
  1998.                                             (cdr args))
  1999.                                       (let g141 ((g140 (car args))
  2000.                                                  (g139 '())
  2001.                                                  (g138 '()))
  2002.                                          (if (null? g140)
  2003.                                              (g137)
  2004.                                              (if (and (pair? (car g140))
  2005.                                                       (pair? (cdar g140))
  2006.                                                       (null? (cddar g140)))
  2007.                                                  (g141 (cdr g140)
  2008.                                                        (cons (cadar g140)
  2009.                                                              g139)
  2010.                                                        (cons (caar g140)
  2011.                                                              g138))
  2012.                                                  (g137)))))
  2013.                                   (let g141 ((g140 (car args))
  2014.                                              (g139 '())
  2015.                                              (g138 '()))
  2016.                                      (if (null? g140)
  2017.                                          (if (and (list? (cdr args))
  2018.                                                   (pair? (cdr args)))
  2019.                                              (g145 (reverse g138)
  2020.                                                    (reverse g139)
  2021.                                                    (cdr args))
  2022.                                              (g137))
  2023.                                          (if (and (pair? (car g140))
  2024.                                                   (pair? (cdar g140))
  2025.                                                   (null? (cddar g140)))
  2026.                                              (g141 (cdr g140)
  2027.                                                    (cons (cadar g140) g139)
  2028.                                                    (cons (caar g140) g138))
  2029.                                              (g137))))))
  2030.                           (let g141 ((g140 (car args))
  2031.                                      (g139 '())
  2032.                                      (g138 '()))
  2033.                              (if (null? g140)
  2034.                                  (if (and (list? (cdr args))
  2035.                                           (pair? (cdr args)))
  2036.                                      (g145 (reverse g138)
  2037.                                            (reverse g139)
  2038.                                            (cdr args))
  2039.                                      (g137))
  2040.                                  (if (and (pair? (car g140))
  2041.                                           (pair? (cdar g140))
  2042.                                           (null? (cddar g140)))
  2043.                                      (g141 (cdr g140)
  2044.                                            (cons (cadar g140) g139)
  2045.                                            (cons (caar g140) g138))
  2046.                                      (g137)))))
  2047.                       (g137))))
  2048.           (g137))))
  2049. (defmacro
  2050.    match-let*
  2051.    args
  2052.    (let ((g123 (lambda ()
  2053.                   (match:syntax-err
  2054.                      `(match-let* ,@args)
  2055.                      "syntax error in"))))
  2056.       (if (pair? args)
  2057.           (if (null? (car args))
  2058.               (if (and (list? (cdr args)) (pair? (cdr args)))
  2059.                   ((lambda (body) `(let* ,@args)) (cdr args))
  2060.                   (g123))
  2061.               (if (and (pair? (car args))
  2062.                        (pair? (caar args))
  2063.                        (pair? (cdaar args))
  2064.                        (null? (cddaar args))
  2065.                        (list? (cdar args))
  2066.                        (list? (cdr args))
  2067.                        (pair? (cdr args)))
  2068.                   ((lambda (pat exp rest body)
  2069.                       (if ((cadddr match:expanders) pat)
  2070.                           `(let ((,pat ,exp)) (match-let* ,rest ,@body))
  2071.                           `(match ,exp (,pat (match-let* ,rest ,@body)))))
  2072.                    (caaar args)
  2073.                    (cadaar args)
  2074.                    (cdar args)
  2075.                    (cdr args))
  2076.                   (g123)))
  2077.           (g123))))
  2078. (defmacro
  2079.    match-letrec
  2080.    args
  2081.    (let ((g115 (cadddr match:expanders))
  2082.          (g114 (lambda (pat exp body)
  2083.                   ((cadr match:expanders)
  2084.                    pat
  2085.                    exp
  2086.                    body
  2087.                    `(match-letrec ((,pat ,exp)) ,@body))))
  2088.          (g110 (lambda (p1 e1 p2 e2 body)
  2089.                   `(match-letrec (((p1 . p2) (cons e1 e2))) ,@body)))
  2090.          (g106 (lambda (pat exp body)
  2091.                   `(match-letrec
  2092.                       ((,(list->vector pat) (vector ,@exp)))
  2093.                       ,@body)))
  2094.          (g98 (lambda ()
  2095.                  (match:syntax-err
  2096.                     `(match-letrec ,@args)
  2097.                     "syntax error in"))))
  2098.       (if (pair? args)
  2099.           (if (list? (car args))
  2100.               (if (match:andmap
  2101.                      (lambda (g121)
  2102.                         (if (and (pair? g121)
  2103.                                  (g115 (car g121))
  2104.                                  (pair? (cdr g121)))
  2105.                             (null? (cddr g121))
  2106.                             #f))
  2107.                      (car args))
  2108.                   (if (and (list? (cdr args)) (pair? (cdr args)))
  2109.                       ((lambda () `(letrec ,@args)))
  2110.                       (let g102 ((g101 (car args)) (g100 '()) (g99 '()))
  2111.                          (if (null? g101)
  2112.                              (g98)
  2113.                              (if (and (pair? (car g101))
  2114.                                       (pair? (cdar g101))
  2115.                                       (null? (cddar g101)))
  2116.                                  (g102 (cdr g101)
  2117.                                        (cons (cadar g101) g100)
  2118.                                        (cons (caar g101) g99))
  2119.                                  (g98)))))
  2120.                   (if (and (pair? (car args))
  2121.                            (pair? (caar args))
  2122.                            (pair? (cdaar args))
  2123.                            (null? (cddaar args)))
  2124.                       (if (null? (cdar args))
  2125.                           (if (and (list? (cdr args)) (pair? (cdr args)))
  2126.                               (g114 (caaar args) (cadaar args) (cdr args))
  2127.                               (let g102 ((g101 (car args))
  2128.                                          (g100 '())
  2129.                                          (g99 '()))
  2130.                                  (if (null? g101)
  2131.                                      (g98)
  2132.                                      (if (and (pair? (car g101))
  2133.                                               (pair? (cdar g101))
  2134.                                               (null? (cddar g101)))
  2135.                                          (g102 (cdr g101)
  2136.                                                (cons (cadar g101) g100)
  2137.                                                (cons (caar g101) g99))
  2138.                                          (g98)))))
  2139.                           (if (and (pair? (cdar args))
  2140.                                    (pair? (cadar args))
  2141.                                    (pair? (cdadar args))
  2142.                                    (null? (cdr (cdadar args)))
  2143.                                    (null? (cddar args)))
  2144.                               (if (and (list? (cdr args))
  2145.                                        (pair? (cdr args)))
  2146.                                   (g110 (caaar args)
  2147.                                         (cadaar args)
  2148.                                         (caadar args)
  2149.                                         (car (cdadar args))
  2150.                                         (cdr args))
  2151.                                   (let g102 ((g101 (car args))
  2152.                                              (g100 '())
  2153.                                              (g99 '()))
  2154.                                      (if (null? g101)
  2155.                                          (g98)
  2156.                                          (if (and (pair? (car g101))
  2157.                                                   (pair? (cdar g101))
  2158.                                                   (null? (cddar g101)))
  2159.                                              (g102 (cdr g101)
  2160.                                                    (cons (cadar g101) g100)
  2161.                                                    (cons (caar g101) g99))
  2162.                                              (g98)))))
  2163.                               (let g102 ((g101 (car args))
  2164.                                          (g100 '())
  2165.                                          (g99 '()))
  2166.                                  (if (null? g101)
  2167.                                      (if (and (list? (cdr args))
  2168.                                               (pair? (cdr args)))
  2169.                                          (g106 (reverse g99)
  2170.                                                (reverse g100)
  2171.                                                (cdr args))
  2172.                                          (g98))
  2173.                                      (if (and (pair? (car g101))
  2174.                                               (pair? (cdar g101))
  2175.                                               (null? (cddar g101)))
  2176.                                          (g102 (cdr g101)
  2177.                                                (cons (cadar g101) g100)
  2178.                                                (cons (caar g101) g99))
  2179.                                          (g98))))))
  2180.                       (let g102 ((g101 (car args)) (g100 '()) (g99 '()))
  2181.                          (if (null? g101)
  2182.                              (if (and (list? (cdr args))
  2183.                                       (pair? (cdr args)))
  2184.                                  (g106 (reverse g99)
  2185.                                        (reverse g100)
  2186.                                        (cdr args))
  2187.                                  (g98))
  2188.                              (if (and (pair? (car g101))
  2189.                                       (pair? (cdar g101))
  2190.                                       (null? (cddar g101)))
  2191.                                  (g102 (cdr g101)
  2192.                                        (cons (cadar g101) g100)
  2193.                                        (cons (caar g101) g99))
  2194.                                  (g98))))))
  2195.               (if (pair? (car args))
  2196.                   (if (and (pair? (caar args))
  2197.                            (pair? (cdaar args))
  2198.                            (null? (cddaar args)))
  2199.                       (if (null? (cdar args))
  2200.                           (if (and (list? (cdr args)) (pair? (cdr args)))
  2201.                               (g114 (caaar args) (cadaar args) (cdr args))
  2202.                               (let g102 ((g101 (car args))
  2203.                                          (g100 '())
  2204.                                          (g99 '()))
  2205.                                  (if (null? g101)
  2206.                                      (g98)
  2207.                                      (if (and (pair? (car g101))
  2208.                                               (pair? (cdar g101))
  2209.                                               (null? (cddar g101)))
  2210.                                          (g102 (cdr g101)
  2211.                                                (cons (cadar g101) g100)
  2212.                                                (cons (caar g101) g99))
  2213.                                          (g98)))))
  2214.                           (if (and (pair? (cdar args))
  2215.                                    (pair? (cadar args))
  2216.                                    (pair? (cdadar args))
  2217.                                    (null? (cdr (cdadar args)))
  2218.                                    (null? (cddar args)))
  2219.                               (if (and (list? (cdr args))
  2220.                                        (pair? (cdr args)))
  2221.                                   (g110 (caaar args)
  2222.                                         (cadaar args)
  2223.                                         (caadar args)
  2224.                                         (car (cdadar args))
  2225.                                         (cdr args))
  2226.                                   (let g102 ((g101 (car args))
  2227.                                              (g100 '())
  2228.                                              (g99 '()))
  2229.                                      (if (null? g101)
  2230.                                          (g98)
  2231.                                          (if (and (pair? (car g101))
  2232.                                                   (pair? (cdar g101))
  2233.                                                   (null? (cddar g101)))
  2234.                                              (g102 (cdr g101)
  2235.                                                    (cons (cadar g101) g100)
  2236.                                                    (cons (caar g101) g99))
  2237.                                              (g98)))))
  2238.                               (let g102 ((g101 (car args))
  2239.                                          (g100 '())
  2240.                                          (g99 '()))
  2241.                                  (if (null? g101)
  2242.                                      (if (and (list? (cdr args))
  2243.                                               (pair? (cdr args)))
  2244.                                          (g106 (reverse g99)
  2245.                                                (reverse g100)
  2246.                                                (cdr args))
  2247.                                          (g98))
  2248.                                      (if (and (pair? (car g101))
  2249.                                               (pair? (cdar g101))
  2250.                                               (null? (cddar g101)))
  2251.                                          (g102 (cdr g101)
  2252.                                                (cons (cadar g101) g100)
  2253.                                                (cons (caar g101) g99))
  2254.                                          (g98))))))
  2255.                       (let g102 ((g101 (car args)) (g100 '()) (g99 '()))
  2256.                          (if (null? g101)
  2257.                              (if (and (list? (cdr args))
  2258.                                       (pair? (cdr args)))
  2259.                                  (g106 (reverse g99)
  2260.                                        (reverse g100)
  2261.                                        (cdr args))
  2262.                                  (g98))
  2263.                              (if (and (pair? (car g101))
  2264.                                       (pair? (cdar g101))
  2265.                                       (null? (cddar g101)))
  2266.                                  (g102 (cdr g101)
  2267.                                        (cons (cadar g101) g100)
  2268.                                        (cons (caar g101) g99))
  2269.                                  (g98)))))
  2270.                   (g98)))
  2271.           (g98))))
  2272. (defmacro
  2273.    match-define
  2274.    args
  2275.    (let ((g94 (cadddr match:expanders))
  2276.          (g92 (lambda ()
  2277.                  (match:syntax-err
  2278.                     `(match-define ,@args)
  2279.                     "syntax error in"))))
  2280.       (if (pair? args)
  2281.           (if (g94 (car args))
  2282.               (if (and (pair? (cdr args)) (null? (cddr args)))
  2283.                   ((lambda () `(begin (define ,@args))))
  2284.                   (g92))
  2285.               (if (and (pair? (cdr args)) (null? (cddr args)))
  2286.                   ((lambda (pat exp)
  2287.                       ((caddr match:expanders)
  2288.                        pat
  2289.                        exp
  2290.                        `(match-define ,@args)))
  2291.                    (car args)
  2292.                    (cadr args))
  2293.                   (g92)))
  2294.           (g92))))
  2295. (define match:runtime-structures #f)
  2296. (define match:set-runtime-structures
  2297.    (lambda (v) (set! match:runtime-structures v)))
  2298. (define match:primitive-vector? vector?)
  2299. (defmacro
  2300.    define-structure
  2301.    args
  2302.    (let ((g77 (lambda ()
  2303.                  (match:syntax-err
  2304.                     `(define-structure ,@args)
  2305.                     "syntax error in"))))
  2306.       (if (and (pair? args)
  2307.                (pair? (car args))
  2308.                (list? (cdar args)))
  2309.           (if (null? (cdr args))
  2310.               ((lambda (name id1) `(define-structure (,name ,@id1) ()))
  2311.                (caar args)
  2312.                (cdar args))
  2313.               (if (and (pair? (cdr args)) (list? (cadr args)))
  2314.                   (let g84 ((g83 (cadr args)) (g82 '()) (g81 '()))
  2315.                      (if (null? g83)
  2316.                          (if (null? (cddr args))
  2317.                              ((lambda (name id1 id2 val)
  2318.                                  `(define-const-structure
  2319.                                      (,name
  2320.                                         ,@(map (lambda (id) `(! ,id)) id1))
  2321.                                      ,(map (lambda (id v) `((! ,id) ,v))
  2322.                                            id2
  2323.                                            val)))
  2324.                               (caar args)
  2325.                               (cdar args)
  2326.                               (reverse g81)
  2327.                               (reverse g82))
  2328.                              (g77))
  2329.                          (if (and (pair? (car g83))
  2330.                                   (pair? (cdar g83))
  2331.                                   (null? (cddar g83)))
  2332.                              (g84 (cdr g83)
  2333.                                   (cons (cadar g83) g82)
  2334.                                   (cons (caar g83) g81))
  2335.                              (g77))))
  2336.                   (g77)))
  2337.           (g77))))
  2338. (defmacro
  2339.    define-const-structure
  2340.    args
  2341.    (let ((arg-name (lambda (x) (if (symbol? x) x (cadr x))))
  2342.          (with-mutator? (lambda (x) (not (symbol? x))))
  2343.          (ident? (lambda (id)
  2344.                     (if (symbol? id)
  2345.                         ((lambda () #t))
  2346.                         (if (and (pair? id)
  2347.                                  (equal? (car id) '!)
  2348.                                  (pair? (cdr id))
  2349.                                  (symbol? (cadr id))
  2350.                                  (null? (cddr id)))
  2351.                             ((lambda () #t))
  2352.                             ((lambda () #f))))))
  2353.          (symbol-append (lambda l
  2354.                            (string->symbol
  2355.                               (apply
  2356.                                  string-append
  2357.                                  (map (lambda (x)
  2358.                                          (cond
  2359.                                             ((symbol? x) (symbol->string x))
  2360.                                             ((number? x) (number->string x))
  2361.                                             (else x)))
  2362.                                       l))))))
  2363.       (let ((g57 (lambda ()
  2364.                     (match:syntax-err
  2365.                        `(define-const-structure ,@args)
  2366.                        "syntax error in"))))
  2367.          (if (and (pair? args)
  2368.                   (pair? (car args))
  2369.                   (list? (cdar args)))
  2370.              (if (null? (cdr args))
  2371.                  ((lambda (name id1)
  2372.                      `(define-const-structure (,name ,@id1) ()))
  2373.                   (caar args)
  2374.                   (cdar args))
  2375.                  (if (symbol? (caar args))
  2376.                      (let g60 ((g59 (cdar args)) (g58 '()))
  2377.                         (if (null? g59)
  2378.                             (if (and (pair? (cdr args))
  2379.                                      (list? (cadr args)))
  2380.                                 (let g64 ((g63 (cadr args))
  2381.                                           (g62 '())
  2382.                                           (g61 '()))
  2383.                                    (if (null? g63)
  2384.                                        (if (null? (cddr args))
  2385.                                            ((lambda (name id1 id2 val)
  2386.                                                (let* ((id1id2 (append
  2387.                                                                  id1
  2388.                                                                  id2))
  2389.                                                       (constructor (symbol-append
  2390.                                                                       'make-
  2391.                                                                       name))
  2392.                                                       (predicate (symbol-append
  2393.                                                                     name
  2394.                                                                     '?))
  2395.                                                       (arg1 (map (lambda (a)
  2396.                                                                     (if (eq? (arg-name
  2397.                                                                                 a)
  2398.                                                                              '_)
  2399.                                                                         (gentemp)
  2400.                                                                         (arg-name
  2401.                                                                            a)))
  2402.                                                                  id1))
  2403.                                                       (arg2 (map (lambda (a)
  2404.                                                                     (if (eq? (arg-name
  2405.                                                                                 a)
  2406.                                                                              '_)
  2407.                                                                         (gentemp)
  2408.                                                                         (arg-name
  2409.                                                                            a)))
  2410.                                                                  id2))
  2411.                                                       (access (let loop ((l id1id2))
  2412.                                                                  (cond
  2413.                                                                     ((null?
  2414.                                                                         l) '())
  2415.                                                                     ((eq? '_
  2416.                                                                           (arg-name
  2417.                                                                              (car l))) (loop (cdr l)))
  2418.                                                                     (else (cons (symbol-append
  2419.                                                                                    name
  2420.                                                                                    '-
  2421.                                                                                    (arg-name
  2422.                                                                                       (car l)))
  2423.                                                                                 (loop (cdr l)))))))
  2424.                                                       (access-index (let loop ((l id1id2)
  2425.                                                                                (n 1))
  2426.                                                                        (cond
  2427.                                                                           ((null?
  2428.                                                                               l) '())
  2429.                                                                           ((eq? '_
  2430.                                                                                 (arg-name
  2431.                                                                                    (car l))) (loop (cdr l)
  2432.                                                                                                    (+ 1
  2433.                                                                                                       n)))
  2434.                                                                           (else (cons n
  2435.                                                                                       (loop (cdr l)
  2436.                                                                                             (+ 1
  2437.                                                                                                n)))))))
  2438.                                                       (n-access (let loop ((l id1id2)
  2439.                                                                            (n 1))
  2440.                                                                    (cond
  2441.                                                                       ((null?
  2442.                                                                           l) '())
  2443.                                                                       (else (cons (symbol-append
  2444.                                                                                      name
  2445.                                                                                      '-
  2446.                                                                                      n)
  2447.                                                                                   (loop (cdr l)
  2448.                                                                                         (+ 1
  2449.                                                                                            n)))))))
  2450.                                                       (n-access-index (let loop ((l id1id2)
  2451.                                                                                  (n 1))
  2452.                                                                          (cond
  2453.                                                                             ((null?
  2454.                                                                                 l) '())
  2455.                                                                             (else (cons n
  2456.                                                                                         (loop (cdr l)
  2457.                                                                                               (+ 1
  2458.                                                                                                  n)))))))
  2459.                                                       (assign (let loop ((l id1id2))
  2460.                                                                  (cond
  2461.                                                                     ((null?
  2462.                                                                         l) '())
  2463.                                                                     ((eq? '_
  2464.                                                                           (arg-name
  2465.                                                                              (car l))) (loop (cdr l)))
  2466.                                                                     ((not (with-mutator?
  2467.                                                                              (car l))) (loop (cdr l)))
  2468.                                                                     (else (cons (symbol-append
  2469.                                                                                    'set-
  2470.                                                                                    name
  2471.                                                                                    '-
  2472.                                                                                    (arg-name
  2473.                                                                                       (car l))
  2474.                                                                                    '!)
  2475.                                                                                 (loop (cdr l)))))))
  2476.                                                       (assign-index (let loop ((l id1id2)
  2477.                                                                                (n 1))
  2478.                                                                        (cond
  2479.                                                                           ((null?
  2480.                                                                               l) '())
  2481.                                                                           ((eq? '_
  2482.                                                                                 (arg-name
  2483.                                                                                    (car l))) (loop (cdr l)
  2484.                                                                                                    (+ 1
  2485.                                                                                                       n)))
  2486.                                                                           ((not (with-mutator?
  2487.                                                                                    (car l))) (loop (cdr l)
  2488.                                                                                                    (+ 1
  2489.                                                                                                       n)))
  2490.                                                                           (else (cons n
  2491.                                                                                       (loop (cdr l)
  2492.                                                                                             (+ 1
  2493.                                                                                                n)))))))
  2494.                                                       (n-assign (let loop ((l id1id2)
  2495.                                                                            (n 1))
  2496.                                                                    (cond
  2497.                                                                       ((null?
  2498.                                                                           l) '())
  2499.                                                                       ((not (with-mutator?
  2500.                                                                                (car l))) (loop (cdr l)
  2501.                                                                                                (+ 1
  2502.                                                                                                   n)))
  2503.                                                                       (else (cons (symbol-append
  2504.                                                                                      'set-
  2505.                                                                                      name
  2506.                                                                                      '-
  2507.                                                                                      n
  2508.                                                                                      '!)
  2509.                                                                                   (loop (cdr l)
  2510.                                                                                         (+ 1
  2511.                                                                                            n)))))))
  2512.                                                       (n-assign-index (let loop ((l id1id2)
  2513.                                                                                  (n 1))
  2514.                                                                          (cond
  2515.                                                                             ((null?
  2516.                                                                                 l) '())
  2517.                                                                             ((not (with-mutator?
  2518.                                                                                      (car l))) (loop (cdr l)
  2519.                                                                                                      (+ 1
  2520.                                                                                                         n)))
  2521.                                                                             (else (cons n
  2522.                                                                                         (loop (cdr l)
  2523.                                                                                               (+ 1
  2524.                                                                                                  n)))))))
  2525.                                                       (count (length
  2526.                                                                 (cons name
  2527.                                                                       id1id2)))
  2528.                                                       (tag (if match:runtime-structures
  2529.                                                                (gentemp)
  2530.                                                                `',(match:make-structure-tag
  2531.                                                                      name)))
  2532.                                                       (vectorP (cond
  2533.                                                                   ((eq? match:structure-control
  2534.                                                                         'disjoint) 'match:primitive-vector?)
  2535.                                                                   ((eq? match:structure-control
  2536.                                                                         'vector) 'vector?))))
  2537.                                                   (cond
  2538.                                                      ((eq? match:structure-control
  2539.                                                            'disjoint) (if (eq? vector?
  2540.                                                                                match:primitive-vector?)
  2541.                                                                           (set! vector?
  2542.                                                                              (lambda (v)
  2543.                                                                                 (and (match:primitive-vector?
  2544.                                                                                         v)
  2545.                                                                                      (or (zero?
  2546.                                                                                             (vector-length
  2547.                                                                                                v))
  2548.                                                                                          (not (symbol?
  2549.                                                                                                  (vector-ref
  2550.                                                                                                     v
  2551.                                                                                                     0)))
  2552.                                                                                          (not (match:structure?
  2553.                                                                                                  (vector-ref
  2554.                                                                                                     v
  2555.                                                                                                     0))))))))
  2556.                                                       (if (not (memq predicate
  2557.                                                                      match:disjoint-predicates))
  2558.                                                           (set! match:disjoint-predicates
  2559.                                                              (cons predicate
  2560.                                                                    match:disjoint-predicates))))
  2561.                                                      ((eq? match:structure-control
  2562.                                                            'vector) (if (not (memq predicate
  2563.                                                                                    match:vector-structures))
  2564.                                                                         (set! match:vector-structures
  2565.                                                                            (cons predicate
  2566.                                                                                  match:vector-structures))))
  2567.                                                      (else (match:syntax-err
  2568.                                                               '(vector
  2569.                                                                   disjoint)
  2570.                                                               "invalid value for match:structure-control, legal values are")))
  2571.                                                   `(begin ,@(if match:runtime-structures
  2572.                                                                 `((define ,tag
  2573.                                                                      (match:make-structure-tag
  2574.                                                                         ',name)))
  2575.                                                                 '())
  2576.                                                           (define ,constructor
  2577.                                                              (lambda ,arg1
  2578.                                                                 (let* ,(map list
  2579.                                                                             arg2
  2580.                                                                             val)
  2581.                                                                    (vector
  2582.                                                                       ,tag
  2583.                                                                       ,@arg1
  2584.                                                                       ,@arg2))))
  2585.                                                           (define ,predicate
  2586.                                                              (lambda (obj)
  2587.                                                                 (and (,vectorP
  2588.                                                                         obj)
  2589.                                                                      (= (vector-length
  2590.                                                                            obj)
  2591.                                                                         ,count)
  2592.                                                                      (eq? (vector-ref
  2593.                                                                              obj
  2594.                                                                              0)
  2595.                                                                           ,tag))))
  2596.                                                           ,@(map (lambda (n
  2597.                                                                           i)
  2598.                                                                     `(define ,n
  2599.                                                                         (lambda (obj)
  2600.                                                                            (vector-ref
  2601.                                                                               obj
  2602.                                                                               ,i))))
  2603.                                                                  access
  2604.                                                                  access-index)
  2605.                                                           ,@(map (lambda (n
  2606.                                                                           i)
  2607.                                                                     `(define ,n
  2608.                                                                         (lambda (obj
  2609.                                                                                  newval)
  2610.                                                                            (vector-set!
  2611.                                                                               obj
  2612.                                                                               ,i
  2613.                                                                               newval))))
  2614.                                                                  assign
  2615.                                                                  assign-index)
  2616.                                                           ,@(map (lambda (n
  2617.                                                                           i)
  2618.                                                                     `(define ,n
  2619.                                                                         (lambda (obj)
  2620.                                                                            (vector-ref
  2621.                                                                               obj
  2622.                                                                               ,i))))
  2623.                                                                  n-access
  2624.                                                                  n-access-index)
  2625.                                                           ,@(map (lambda (n
  2626.                                                                           i)
  2627.                                                                     `(define ,n
  2628.                                                                         (lambda (obj
  2629.                                                                                  newval)
  2630.                                                                            (vector-set!
  2631.                                                                               obj
  2632.                                                                               ,i
  2633.                                                                               newval))))
  2634.                                                                  n-assign
  2635.                                                                  n-assign-index))))
  2636.                                             (caar args)
  2637.                                             (reverse g58)
  2638.                                             (reverse g61)
  2639.                                             (reverse g62))
  2640.                                            (g57))
  2641.                                        (if (and (pair? (car g63))
  2642.                                                 (ident? (caar g63))
  2643.                                                 (pair? (cdar g63))
  2644.                                                 (null? (cddar g63)))
  2645.                                            (g64 (cdr g63)
  2646.                                                 (cons (cadar g63) g62)
  2647.                                                 (cons (caar g63) g61))
  2648.                                            (g57))))
  2649.                                 (g57))
  2650.                             (if (ident? (car g59))
  2651.                                 (g60 (cdr g59) (cons (car g59) g58))
  2652.                                 (g57))))
  2653.                      (g57)))
  2654.              (g57)))))
  2655.  
  2656. (provide 'match-slib)
  2657.