Artifact
49d6d8243534ff0f26dd7ed384c77f55e9f02ae2:
- File
foof/match.scm
— part of check-in
[112a40d018]
at
2016-09-01 08:27:10
on branch trunk
— various improvements, added lmdb , added license notices
(user:
ovenpasta@pizzahack.eu
size: 21746)
0000: 3b 3b 3b 3b 20 6d 61 74 63 68 2e 73 63 6d 20 2d ;;;; match.scm -
0010: 2d 20 70 6f 72 74 61 62 6c 65 20 68 79 67 69 65 - portable hygie
0020: 6e 69 63 20 70 61 74 74 65 72 6e 20 6d 61 74 63 nic pattern matc
0030: 68 65 72 0a 3b 3b 0a 3b 3b 20 54 68 69 73 20 63 her.;;.;; This c
0040: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 62 ode is written b
0050: 79 20 41 6c 65 78 20 53 68 69 6e 6e 20 61 6e 64 y Alex Shinn and
0060: 20 70 6c 61 63 65 64 20 69 6e 20 74 68 65 0a 3b placed in the.;
0070: 3b 20 50 75 62 6c 69 63 20 44 6f 6d 61 69 6e 2e ; Public Domain.
0080: 20 20 41 6c 6c 20 77 61 72 72 61 6e 74 69 65 73 All warranties
0090: 20 61 72 65 20 64 69 73 63 6c 61 69 6d 65 64 2e are disclaimed.
00a0: 0a 0a 3b 3b 20 54 68 69 73 20 69 73 20 61 20 66 ..;; This is a f
00b0: 75 6c 6c 20 73 75 70 65 72 73 65 74 20 6f 66 20 ull superset of
00c0: 74 68 65 20 70 6f 70 75 6c 61 72 20 4d 41 54 43 the popular MATC
00d0: 48 20 70 61 63 6b 61 67 65 20 62 79 20 41 6e 64 H package by And
00e0: 72 65 77 0a 3b 3b 20 57 72 69 67 68 74 2c 20 77 rew.;; Wright, w
00f0: 72 69 74 74 65 6e 20 69 6e 20 66 75 6c 6c 79 20 ritten in fully
0100: 70 6f 72 74 61 62 6c 65 20 53 59 4e 54 41 58 2d portable SYNTAX-
0110: 52 55 4c 45 53 20 28 52 35 52 53 20 6f 6e 6c 79 RULES (R5RS only
0120: 2c 20 62 72 65 61 6b 73 0a 3b 3b 20 69 6e 20 52 , breaks.;; in R
0130: 36 52 53 20 53 59 4e 54 41 58 2d 52 55 4c 45 53 6RS SYNTAX-RULES
0140: 29 2c 20 61 6e 64 20 74 68 75 73 20 70 72 65 73 ), and thus pres
0150: 65 72 76 69 6e 67 20 68 79 67 69 65 6e 65 2e 0a erving hygiene..
0160: 0a 3b 3b 20 54 68 69 73 20 69 73 20 61 20 73 69 .;; This is a si
0170: 6d 70 6c 65 20 67 65 6e 65 72 61 74 69 76 65 20 mple generative
0180: 70 61 74 74 65 72 6e 20 6d 61 74 63 68 65 72 20 pattern matcher
0190: 2d 20 65 61 63 68 20 70 61 74 74 65 72 6e 20 69 - each pattern i
01a0: 73 0a 3b 3b 20 65 78 70 61 6e 64 65 64 20 69 6e s.;; expanded in
01b0: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 to the required
01c0: 74 65 73 74 73 2c 20 63 61 6c 6c 69 6e 67 20 61 tests, calling a
01d0: 20 66 61 69 6c 75 72 65 20 63 6f 6e 74 69 6e 75 failure continu
01e0: 61 74 69 6f 6e 20 69 66 0a 3b 3b 20 74 68 65 20 ation if.;; the
01f0: 74 65 73 74 73 20 66 61 69 6c 2e 20 20 54 68 69 tests fail. Thi
0200: 73 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 67 69 s makes the logi
0210: 63 20 65 61 73 79 20 74 6f 20 66 6f 6c 6c 6f 77 c easy to follow
0220: 20 61 6e 64 20 65 78 74 65 6e 64 2c 0a 3b 3b 20 and extend,.;;
0230: 62 75 74 20 70 72 6f 64 75 63 65 73 20 73 75 62 but produces sub
0240: 2d 6f 70 74 69 6d 61 6c 20 63 6f 64 65 20 69 6e -optimal code in
0250: 20 63 61 73 65 73 20 77 68 65 72 65 20 79 6f 75 cases where you
0260: 20 68 61 76 65 20 6d 61 6e 79 20 73 69 6d 69 6c have many simil
0270: 61 72 0a 3b 3b 20 63 6c 61 75 73 65 73 20 64 75 ar.;; clauses du
0280: 65 20 74 6f 20 72 65 70 65 61 74 69 6e 67 20 74 e to repeating t
0290: 68 65 20 73 61 6d 65 20 74 65 73 74 73 2e 20 20 he same tests.
02a0: 4e 6f 6e 65 74 68 65 6c 65 73 73 20 61 20 73 6d Nonetheless a sm
02b0: 61 72 74 0a 3b 3b 20 63 6f 6d 70 69 6c 65 72 20 art.;; compiler
02c0: 73 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 should be able t
02d0: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 72 65 64 o remove the red
02e0: 75 6e 64 61 6e 74 20 74 65 73 74 73 2e 20 20 46 undant tests. F
02f0: 6f 72 0a 3b 3b 20 4d 41 54 43 48 2d 4c 45 54 20 or.;; MATCH-LET
0300: 61 6e 64 20 44 45 53 54 52 55 43 54 55 52 49 4e and DESTRUCTURIN
0310: 47 2d 42 49 4e 44 20 74 79 70 65 20 75 73 65 73 G-BIND type uses
0320: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 65 72 there is no per
0330: 66 6f 72 6d 61 6e 63 65 0a 3b 3b 20 68 69 74 2e formance.;; hit.
0340: 0a 0a 3b 3b 20 54 68 65 20 6f 72 69 67 69 6e 61 ..;; The origina
0350: 6c 20 76 65 72 73 69 6f 6e 20 77 61 73 20 77 72 l version was wr
0360: 69 74 74 65 6e 20 6f 6e 20 32 30 30 36 2f 31 31 itten on 2006/11
0370: 2f 32 39 20 61 6e 64 20 64 65 73 63 72 69 62 65 /29 and describe
0380: 64 20 69 6e 20 74 68 65 0a 3b 3b 20 66 6f 6c 6c d in the.;; foll
0390: 6f 77 69 6e 67 20 55 73 65 6e 65 74 20 70 6f 73 owing Usenet pos
03a0: 74 3a 0a 3b 3b 20 20 20 68 74 74 70 3a 2f 2f 67 t:.;; http://g
03b0: 72 6f 75 70 73 2e 67 6f 6f 67 6c 65 2e 63 6f 6d roups.google.com
03c0: 2f 67 72 6f 75 70 2f 63 6f 6d 70 2e 6c 61 6e 67 /group/comp.lang
03d0: 2e 73 63 68 65 6d 65 2f 6d 73 67 2f 30 39 34 31 .scheme/msg/0941
03e0: 32 33 34 64 65 37 31 31 32 66 66 64 0a 3b 3b 20 234de7112ffd.;;
03f0: 61 6e 64 20 69 73 20 73 74 69 6c 6c 20 61 76 61 and is still ava
0400: 69 6c 61 62 6c 65 20 61 74 0a 3b 3b 20 20 20 68 ilable at.;; h
0410: 74 74 70 3a 2f 2f 73 79 6e 74 68 63 6f 64 65 2e ttp://synthcode.
0420: 63 6f 6d 2f 73 63 68 65 6d 65 2f 6d 61 74 63 68 com/scheme/match
0430: 2d 73 69 6d 70 6c 65 2e 73 63 6d 0a 3b 3b 20 41 -simple.scm.;; A
0440: 20 76 61 72 69 61 6e 74 20 6f 66 20 74 68 69 73 variant of this
0450: 20 66 69 6c 65 20 77 68 69 63 68 20 75 73 65 73 file which uses
0460: 20 43 4f 4e 44 2d 45 58 50 41 4e 44 20 69 6e 20 COND-EXPAND in
0470: 61 20 66 65 77 20 70 6c 61 63 65 73 20 63 61 6e a few places can
0480: 0a 3b 3b 20 62 65 20 66 6f 75 6e 64 20 61 74 0a .;; be found at.
0490: 3b 3b 20 20 20 68 74 74 70 3a 2f 2f 73 79 6e 74 ;; http://synt
04a0: 68 63 6f 64 65 2e 63 6f 6d 2f 73 63 68 65 6d 65 hcode.com/scheme
04b0: 2f 6d 61 74 63 68 2d 63 6f 6e 64 2d 65 78 70 61 /match-cond-expa
04c0: 6e 64 2e 73 63 6d 0a 3b 3b 0a 3b 3b 20 32 30 30 nd.scm.;;.;; 200
04d0: 38 2f 30 33 2f 32 30 20 2d 20 66 69 78 69 6e 67 8/03/20 - fixing
04e0: 20 62 75 67 20 77 68 65 72 65 20 28 61 20 2e 2e bug where (a ..
04f0: 2e 29 20 6d 61 74 63 68 65 64 20 6e 6f 6e 2d 6c .) matched non-l
0500: 69 73 74 73 0a 3b 3b 20 32 30 30 38 2f 30 33 2f ists.;; 2008/03/
0510: 31 35 20 2d 20 72 65 6d 6f 76 69 6e 67 20 72 65 15 - removing re
0520: 64 75 6e 64 61 6e 74 20 63 68 65 63 6b 20 69 6e dundant check in
0530: 20 76 65 63 74 6f 72 20 70 61 74 74 65 72 6e 73 vector patterns
0540: 0a 3b 3b 20 32 30 30 38 2f 30 33 2f 30 36 20 2d .;; 2008/03/06 -
0550: 20 79 6f 75 20 63 61 6e 20 75 73 65 20 60 2e 2e you can use `..
0560: 2e 27 20 70 6f 72 74 61 62 6c 79 20 6e 6f 77 20 .' portably now
0570: 28 74 68 61 6e 6b 73 20 74 6f 20 54 61 79 6c 6f (thanks to Taylo
0580: 72 20 43 61 6d 70 62 65 6c 6c 29 0a 3b 3b 20 32 r Campbell).;; 2
0590: 30 30 37 2f 30 39 2f 30 34 20 2d 20 66 69 78 69 007/09/04 - fixi
05a0: 6e 67 20 71 75 61 73 69 71 75 6f 74 65 20 70 61 ng quasiquote pa
05b0: 74 74 65 72 6e 73 0a 3b 3b 20 32 30 30 37 2f 30 tterns.;; 2007/0
05c0: 37 2f 32 31 20 2d 20 61 6c 6c 6f 77 69 6e 67 20 7/21 - allowing
05d0: 65 6c 6c 69 70 73 65 20 70 61 74 74 65 72 6e 73 ellipse patterns
05e0: 20 69 6e 20 6e 6f 6e 2d 66 69 6e 61 6c 20 6c 69 in non-final li
05f0: 73 74 20 70 6f 73 69 74 69 6f 6e 73 0a 3b 3b 20 st positions.;;
0600: 32 30 30 37 2f 30 34 2f 31 30 20 2d 20 66 69 78 2007/04/10 - fix
0610: 69 6e 67 20 70 6f 74 65 6e 74 69 61 6c 20 68 79 ing potential hy
0620: 67 69 65 6e 65 20 69 73 73 75 65 20 69 6e 20 6d giene issue in m
0630: 61 74 63 68 2d 63 68 65 63 6b 2d 65 6c 6c 69 70 atch-check-ellip
0640: 73 65 0a 3b 3b 20 20 20 20 20 20 20 20 20 20 20 se.;;
0650: 20 20 20 28 74 68 61 6e 6b 73 20 74 6f 20 54 61 (thanks to Ta
0660: 79 6c 6f 72 20 43 61 6d 70 62 65 6c 6c 29 0a 3b ylor Campbell).;
0670: 3b 20 32 30 30 37 2f 30 34 2f 30 38 20 2d 20 63 ; 2007/04/08 - c
0680: 6c 65 61 6e 20 75 70 2c 20 63 6f 6d 6d 65 6e 74 lean up, comment
0690: 69 6e 67 0a 3b 3b 20 32 30 30 36 2f 31 32 2f 32 ing.;; 2006/12/2
06a0: 34 20 2d 20 62 75 67 66 69 78 65 73 0a 3b 3b 20 4 - bugfixes.;;
06b0: 32 30 30 36 2f 31 32 2f 30 31 20 2d 20 6e 6f 6e 2006/12/01 - non
06c0: 2d 6c 69 6e 65 61 72 20 70 61 74 74 65 72 6e 73 -linear patterns
06d0: 2c 20 73 68 61 72 65 64 20 76 61 72 69 61 62 6c , shared variabl
06e0: 65 73 20 69 6e 20 4f 52 2c 20 67 65 74 21 2f 73 es in OR, get!/s
06f0: 65 74 21 0a 0a 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b et!..;;;;;;;;;;;
0700: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
0710: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
0720: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
0730: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0a 3b 3b ;;;;;;;;;;;;;.;;
0740: 20 66 6f 72 63 65 20 63 6f 6d 70 69 6c 65 2d 74 force compile-t
0750: 69 6d 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 ime syntax error
0760: 73 20 77 69 74 68 20 75 73 65 66 75 6c 20 6d 65 s with useful me
0770: 73 73 61 67 65 73 0a 0a 28 64 65 66 69 6e 65 2d ssages..(define-
0780: 73 79 6e 74 61 78 20 6d 61 74 63 68 2d 73 79 6e syntax match-syn
0790: 74 61 78 2d 65 72 72 6f 72 0a 20 20 28 73 79 6e tax-error. (syn
07a0: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 tax-rules ().
07b0: 20 28 28 5f 29 0a 20 20 20 20 20 28 6d 61 74 63 ((_). (matc
07c0: 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f 72 20 22 h-syntax-error "
07d0: 69 6e 76 61 6c 69 64 20 6d 61 74 63 68 2d 73 79 invalid match-sy
07e0: 6e 74 61 78 2d 65 72 72 6f 72 20 75 73 61 67 65 ntax-error usage
07f0: 22 29 29 29 29 0a 0a 3b 3b 3b 3b 3b 3b 3b 3b 3b "))))..;;;;;;;;;
0800: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
0810: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
0820: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
0830: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0a ;;;;;;;;;;;;;;;.
0840: 0a 3b 3b 20 54 68 65 20 62 61 73 69 63 20 69 6e .;; The basic in
0850: 74 65 72 66 61 63 65 2e 20 20 4d 41 54 43 48 20 terface. MATCH
0860: 6a 75 73 74 20 70 65 72 66 6f 72 6d 73 20 73 6f just performs so
0870: 6d 65 20 62 61 73 69 63 20 73 79 6e 74 61 78 0a me basic syntax.
0880: 3b 3b 20 76 61 6c 69 64 61 74 69 6f 6e 2c 20 62 ;; validation, b
0890: 69 6e 64 73 20 74 68 65 20 6d 61 74 63 68 20 65 inds the match e
08a0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61 20 74 xpression to a t
08b0: 65 6d 70 6f 72 61 72 79 20 76 61 72 69 61 62 6c emporary variabl
08c0: 65 20 60 76 27 2c 0a 3b 3b 20 61 6e 64 20 70 61 e `v',.;; and pa
08d0: 73 73 65 73 20 69 74 20 6f 6e 20 74 6f 20 4d 41 sses it on to MA
08e0: 54 43 48 2d 4e 45 58 54 2e 20 20 49 74 27 73 20 TCH-NEXT. It's
08f0: 61 20 63 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75 a constant throu
0900: 67 68 6f 75 74 20 74 68 65 0a 3b 3b 20 63 6f 64 ghout the.;; cod
0910: 65 20 62 65 6c 6f 77 20 74 68 61 74 20 74 68 65 e below that the
0920: 20 62 69 6e 64 69 6e 67 20 60 76 27 20 69 73 20 binding `v' is
0930: 61 20 64 69 72 65 63 74 20 76 61 72 69 61 62 6c a direct variabl
0940: 65 20 72 65 66 65 72 65 6e 63 65 2c 20 6e 6f 74 e reference, not
0950: 0a 3b 3b 20 61 6e 20 65 78 70 72 65 73 73 69 6f .;; an expressio
0960: 6e 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 n...(define-synt
0970: 61 78 20 6d 61 74 63 68 0a 20 20 28 73 79 6e 74 ax match. (synt
0980: 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 ax-rules ().
0990: 28 28 6d 61 74 63 68 29 0a 20 20 20 20 20 28 6d ((match). (m
09a0: 61 74 63 68 2d 73 79 6e 74 61 78 2d 65 72 72 6f atch-syntax-erro
09b0: 72 20 22 6d 69 73 73 69 6e 67 20 6d 61 74 63 68 r "missing match
09c0: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 29 0a 20 expression")).
09d0: 20 20 20 28 28 6d 61 74 63 68 20 61 74 6f 6d 29 ((match atom)
09e0: 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 73 79 6e . (match-syn
09f0: 74 61 78 2d 65 72 72 6f 72 20 22 6d 69 73 73 69 tax-error "missi
0a00: 6e 67 20 6d 61 74 63 68 20 63 6c 61 75 73 65 22 ng match clause"
0a10: 29 29 0a 20 20 20 20 28 28 6d 61 74 63 68 20 28 )). ((match (
0a20: 61 70 70 20 2e 2e 2e 29 20 28 70 61 74 20 2e 20 app ...) (pat .
0a30: 62 6f 64 79 29 20 2e 2e 2e 29 0a 20 20 20 20 20 body) ...).
0a40: 28 6c 65 74 20 28 28 76 20 28 61 70 70 20 2e 2e (let ((v (app ..
0a50: 2e 29 29 29 0a 20 20 20 20 20 20 20 28 6d 61 74 .))). (mat
0a60: 63 68 2d 6e 65 78 74 20 76 20 28 61 70 70 20 2e ch-next v (app .
0a70: 2e 2e 29 20 28 73 65 74 21 20 28 61 70 70 20 2e ..) (set! (app .
0a80: 2e 2e 29 29 20 28 70 61 74 20 2e 20 62 6f 64 79 ..)) (pat . body
0a90: 29 20 2e 2e 2e 29 29 29 0a 20 20 20 20 28 28 6d ) ...))). ((m
0aa0: 61 74 63 68 20 23 28 76 65 63 20 2e 2e 2e 29 20 atch #(vec ...)
0ab0: 28 70 61 74 20 2e 20 62 6f 64 79 29 20 2e 2e 2e (pat . body) ...
0ac0: 29 0a 20 20 20 20 20 28 6c 65 74 20 28 28 76 20 ). (let ((v
0ad0: 23 28 76 65 63 20 2e 2e 2e 29 29 29 0a 20 20 20 #(vec ...))).
0ae0: 20 20 20 20 28 6d 61 74 63 68 2d 6e 65 78 74 20 (match-next
0af0: 76 20 76 20 28 73 65 74 21 20 76 29 20 28 70 61 v v (set! v) (pa
0b00: 74 20 2e 20 62 6f 64 79 29 20 2e 2e 2e 29 29 29 t . body) ...)))
0b10: 0a 20 20 20 20 28 28 6d 61 74 63 68 20 61 74 6f . ((match ato
0b20: 6d 20 28 70 61 74 20 2e 20 62 6f 64 79 29 20 2e m (pat . body) .
0b30: 2e 2e 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d ..). (match-
0b40: 6e 65 78 74 20 61 74 6f 6d 20 61 74 6f 6d 20 28 next atom atom (
0b50: 73 65 74 21 20 61 74 6f 6d 29 20 28 70 61 74 20 set! atom) (pat
0b60: 2e 20 62 6f 64 79 29 20 2e 2e 2e 29 29 0a 20 20 . body) ...)).
0b70: 20 20 29 29 0a 0a 3b 3b 20 4d 41 54 43 48 2d 4e ))..;; MATCH-N
0b80: 45 58 54 20 70 61 73 73 65 73 20 65 61 63 68 20 EXT passes each
0b90: 63 6c 61 75 73 65 20 74 6f 20 4d 41 54 43 48 2d clause to MATCH-
0ba0: 4f 4e 45 20 69 6e 20 74 75 72 6e 20 77 69 74 68 ONE in turn with
0bb0: 20 69 74 73 20 66 61 69 6c 75 72 65 0a 3b 3b 20 its failure.;;
0bc0: 74 68 75 6e 6b 2c 20 77 68 69 63 68 20 69 73 20 thunk, which is
0bd0: 65 78 70 61 6e 64 65 64 20 62 79 20 72 65 63 75 expanded by recu
0be0: 72 73 69 6e 67 20 4d 41 54 43 48 2d 4e 45 58 54 rsing MATCH-NEXT
0bf0: 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e on the remainin
0c00: 67 0a 3b 3b 20 63 6c 61 75 73 65 73 2e 20 20 60 g.;; clauses. `
0c10: 67 27 20 61 6e 64 20 60 73 27 20 61 72 65 20 74 g' and `s' are t
0c20: 68 65 20 67 65 74 21 20 61 6e 64 20 73 65 74 21 he get! and set!
0c30: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 3b 3b 20 expressions.;;
0c40: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 0a 28 respectively...(
0c50: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 define-syntax ma
0c60: 74 63 68 2d 6e 65 78 74 0a 20 20 28 73 79 6e 74 tch-next. (synt
0c70: 61 78 2d 72 75 6c 65 73 20 28 3d 3e 29 0a 20 20 ax-rules (=>).
0c80: 20 20 3b 3b 20 6e 6f 20 6d 6f 72 65 20 63 6c 61 ;; no more cla
0c90: 75 73 65 73 2c 20 74 68 65 20 6d 61 74 63 68 20 uses, the match
0ca0: 66 61 69 6c 65 64 0a 20 20 20 20 28 28 6d 61 74 failed. ((mat
0cb0: 63 68 2d 6e 65 78 74 20 76 20 67 20 73 29 0a 20 ch-next v g s).
0cc0: 20 20 20 20 28 65 72 72 6f 72 20 27 6d 61 74 63 (error 'matc
0cd0: 68 20 22 6e 6f 20 6d 61 74 63 68 69 6e 67 20 70 h "no matching p
0ce0: 61 74 74 65 72 6e 22 29 29 0a 20 20 20 20 3b 3b attern")). ;;
0cf0: 20 6e 61 6d 65 64 20 66 61 69 6c 75 72 65 20 63 named failure c
0d00: 6f 6e 74 69 6e 75 61 74 69 6f 6e 0a 20 20 20 20 ontinuation.
0d10: 28 28 6d 61 74 63 68 2d 6e 65 78 74 20 76 20 67 ((match-next v g
0d20: 20 73 20 28 70 61 74 20 28 3d 3e 20 66 61 69 6c s (pat (=> fail
0d30: 75 72 65 29 20 2e 20 62 6f 64 79 29 20 2e 20 72 ure) . body) . r
0d40: 65 73 74 29 0a 20 20 20 20 20 28 6c 65 74 20 28 est). (let (
0d50: 28 66 61 69 6c 75 72 65 20 28 6c 61 6d 62 64 61 (failure (lambda
0d60: 20 28 29 20 28 6d 61 74 63 68 2d 6e 65 78 74 20 () (match-next
0d70: 76 20 67 20 73 20 2e 20 72 65 73 74 29 29 29 29 v g s . rest))))
0d80: 0a 20 20 20 20 20 20 20 3b 3b 20 6d 61 74 63 68 . ;; match
0d90: 2d 6f 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 -one analyzes th
0da0: 65 20 70 61 74 74 65 72 6e 20 66 6f 72 20 75 73 e pattern for us
0db0: 0a 20 20 20 20 20 20 20 28 6d 61 74 63 68 2d 6f . (match-o
0dc0: 6e 65 20 76 20 70 61 74 20 67 20 73 20 28 6d 61 ne v pat g s (ma
0dd0: 74 63 68 2d 64 72 6f 70 2d 69 64 73 20 28 62 65 tch-drop-ids (be
0de0: 67 69 6e 20 2e 20 62 6f 64 79 29 29 20 28 66 61 gin . body)) (fa
0df0: 69 6c 75 72 65 29 20 28 29 29 29 29 0a 20 20 20 ilure) ()))).
0e00: 20 3b 3b 20 61 6e 6f 6e 79 6d 6f 75 73 20 66 61 ;; anonymous fa
0e10: 69 6c 75 72 65 20 63 6f 6e 74 69 6e 75 61 74 69 ilure continuati
0e20: 6f 6e 2c 20 67 69 76 65 20 69 74 20 61 20 64 75 on, give it a du
0e30: 6d 6d 79 20 6e 61 6d 65 0a 20 20 20 20 28 28 6d mmy name. ((m
0e40: 61 74 63 68 2d 6e 65 78 74 20 76 20 67 20 73 20 atch-next v g s
0e50: 28 70 61 74 20 2e 20 62 6f 64 79 29 20 2e 20 72 (pat . body) . r
0e60: 65 73 74 29 0a 20 20 20 20 20 28 6d 61 74 63 68 est). (match
0e70: 2d 6e 65 78 74 20 76 20 67 20 73 20 28 70 61 74 -next v g s (pat
0e80: 20 28 3d 3e 20 66 61 69 6c 75 72 65 29 20 2e 20 (=> failure) .
0e90: 62 6f 64 79 29 20 2e 20 72 65 73 74 29 29 29 29 body) . rest))))
0ea0: 0a 0a 3b 3b 20 4d 41 54 43 48 2d 4f 4e 45 20 66 ..;; MATCH-ONE f
0eb0: 69 72 73 74 20 63 68 65 63 6b 73 20 66 6f 72 20 irst checks for
0ec0: 65 6c 6c 69 70 73 65 20 70 61 74 74 65 72 6e 73 ellipse patterns
0ed0: 2c 20 6f 74 68 65 72 77 69 73 65 20 70 61 73 73 , otherwise pass
0ee0: 65 73 20 6f 6e 20 74 6f 0a 3b 3b 20 4d 41 54 43 es on to.;; MATC
0ef0: 48 2d 54 57 4f 2e 0a 0a 28 64 65 66 69 6e 65 2d H-TWO...(define-
0f00: 73 79 6e 74 61 78 20 6d 61 74 63 68 2d 6f 6e 65 syntax match-one
0f10: 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 . (syntax-rules
0f20: 20 28 29 0a 20 20 20 20 3b 3b 20 49 66 20 69 74 (). ;; If it
0f30: 27 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 's a list of two
0f40: 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 74 values, check t
0f50: 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 65 63 o see if the sec
0f60: 6f 6e 64 20 6f 6e 65 20 69 73 0a 20 20 20 20 3b ond one is. ;
0f70: 3b 20 61 6e 20 65 6c 6c 69 70 73 65 20 61 6e 64 ; an ellipse and
0f80: 20 68 61 6e 64 6c 65 20 61 63 63 6f 72 64 69 6e handle accordin
0f90: 67 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 67 gly, otherwise g
0fa0: 6f 20 74 6f 20 4d 41 54 43 48 2d 54 57 4f 2e 0a o to MATCH-TWO..
0fb0: 20 20 20 20 28 28 6d 61 74 63 68 2d 6f 6e 65 20 ((match-one
0fc0: 76 20 28 70 20 71 20 2e 20 72 29 20 67 20 73 20 v (p q . r) g s
0fd0: 73 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 28 6d sk fk i). (m
0fe0: 61 74 63 68 2d 63 68 65 63 6b 2d 65 6c 6c 69 70 atch-check-ellip
0ff0: 73 65 0a 20 20 20 20 20 20 71 0a 20 20 20 20 20 se. q.
1000: 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d (match-extract-
1010: 76 61 72 73 20 70 20 28 6d 61 74 63 68 2d 67 65 vars p (match-ge
1020: 6e 2d 65 6c 6c 69 70 73 65 73 20 76 20 70 20 72 n-ellipses v p r
1030: 20 67 20 73 20 73 6b 20 66 6b 20 69 29 20 69 20 g s sk fk i) i
1040: 28 29 29 0a 20 20 20 20 20 20 28 6d 61 74 63 68 ()). (match
1050: 2d 74 77 6f 20 76 20 28 70 20 71 20 2e 20 72 29 -two v (p q . r)
1060: 20 67 20 73 20 73 6b 20 66 6b 20 69 29 29 29 0a g s sk fk i))).
1070: 20 20 20 20 3b 3b 20 4f 74 68 65 72 77 69 73 65 ;; Otherwise
1080: 2c 20 67 6f 20 64 69 72 65 63 74 6c 79 20 74 6f , go directly to
1090: 20 4d 41 54 43 48 2d 54 57 4f 2e 0a 20 20 20 20 MATCH-TWO..
10a0: 28 28 6d 61 74 63 68 2d 6f 6e 65 20 2e 20 78 29 ((match-one . x)
10b0: 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 74 77 6f . (match-two
10c0: 20 2e 20 78 29 29 29 29 0a 0a 3b 3b 20 54 68 69 . x))))..;; Thi
10d0: 73 20 69 73 20 74 68 65 20 67 75 74 73 20 6f 66 s is the guts of
10e0: 20 74 68 65 20 70 61 74 74 65 72 6e 20 6d 61 74 the pattern mat
10f0: 63 68 65 72 2e 20 20 57 65 20 61 72 65 20 70 61 cher. We are pa
1100: 73 73 65 64 20 61 20 6c 6f 74 20 6f 66 0a 3b 3b ssed a lot of.;;
1110: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 information in
1120: 74 68 65 20 66 6f 72 6d 3a 0a 3b 3b 0a 3b 3b 20 the form:.;;.;;
1130: 20 20 28 6d 61 74 63 68 2d 74 77 6f 20 76 61 72 (match-two var
1140: 20 70 61 74 74 65 72 6e 20 67 65 74 74 65 72 20 pattern getter
1150: 73 65 74 74 65 72 20 73 75 63 63 65 73 73 2d 6b setter success-k
1160: 20 66 61 69 6c 2d 6b 20 28 69 64 73 20 2e 2e 2e fail-k (ids ...
1170: 29 29 0a 3b 3b 0a 3b 3b 20 75 73 75 61 6c 6c 79 )).;;.;; usually
1180: 20 61 62 62 72 65 76 69 61 74 65 64 0a 3b 3b 0a abbreviated.;;.
1190: 3b 3b 20 20 20 28 6d 61 74 63 68 2d 74 77 6f 20 ;; (match-two
11a0: 76 20 70 20 67 20 73 20 73 6b 20 66 6b 20 69 29 v p g s sk fk i)
11b0: 0a 3b 3b 0a 3b 3b 20 77 68 65 72 65 20 56 41 52 .;;.;; where VAR
11c0: 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 6e is the symbol n
11d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 ame of the curre
11e0: 6e 74 20 76 61 72 69 61 62 6c 65 20 77 65 20 61 nt variable we a
11f0: 72 65 0a 3b 3b 20 6d 61 74 63 68 69 6e 67 2c 20 re.;; matching,
1200: 50 41 54 54 45 52 4e 20 69 73 20 74 68 65 20 63 PATTERN is the c
1210: 75 72 72 65 6e 74 20 70 61 74 74 65 72 6e 2c 20 urrent pattern,
1220: 67 65 74 74 65 72 20 61 6e 64 20 73 65 74 74 65 getter and sette
1230: 72 20 61 72 65 20 74 68 65 0a 3b 3b 20 63 6f 72 r are the.;; cor
1240: 72 65 73 70 6f 6e 64 69 6e 67 20 61 63 63 65 73 responding acces
1250: 73 6f 72 73 20 28 65 2e 67 2e 20 43 41 52 20 61 sors (e.g. CAR a
1260: 6e 64 20 53 45 54 2d 43 41 52 21 20 6f 66 20 74 nd SET-CAR! of t
1270: 68 65 20 70 61 69 72 20 68 6f 6c 64 69 6e 67 0a he pair holding.
1280: 3b 3b 20 56 41 52 29 2c 20 53 55 43 43 45 53 53 ;; VAR), SUCCESS
1290: 2d 4b 20 69 73 20 74 68 65 20 73 75 63 63 65 73 -K is the succes
12a0: 73 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 2c 20 s continuation,
12b0: 46 41 49 4c 2d 4b 20 69 73 20 74 68 65 20 66 61 FAIL-K is the fa
12c0: 69 6c 75 72 65 0a 3b 3b 20 63 6f 6e 74 69 6e 75 ilure.;; continu
12d0: 61 74 69 6f 6e 20 28 77 68 69 63 68 20 69 73 20 ation (which is
12e0: 6a 75 73 74 20 61 20 74 68 75 6e 6b 20 63 61 6c just a thunk cal
12f0: 6c 20 61 6e 64 20 69 73 20 74 68 75 73 20 73 61 l and is thus sa
1300: 66 65 20 74 6f 20 65 78 70 61 6e 64 0a 3b 3b 20 fe to expand.;;
1310: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 29 20 multiple times)
1320: 61 6e 64 20 49 44 53 20 61 72 65 20 74 68 65 20 and IDS are the
1330: 6c 69 73 74 20 6f 66 20 69 64 65 6e 74 69 66 69 list of identifi
1340: 65 72 73 20 62 6f 75 6e 64 20 69 6e 20 74 68 65 ers bound in the
1350: 0a 3b 3b 20 70 61 74 74 65 72 6e 20 73 6f 20 66 .;; pattern so f
1360: 61 72 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e ar...(define-syn
1370: 74 61 78 20 6d 61 74 63 68 2d 74 77 6f 0a 20 20 tax match-two.
1380: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 5f (syntax-rules (_
1390: 20 5f 5f 5f 20 71 75 6f 74 65 20 71 75 61 73 69 ___ quote quasi
13a0: 71 75 6f 74 65 20 3f 20 24 20 3d 20 61 6e 64 20 quote ? $ = and
13b0: 6f 72 20 6e 6f 74 20 73 65 74 21 20 67 65 74 21 or not set! get!
13c0: 29 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 77 ). ((match-tw
13d0: 6f 20 76 20 28 29 20 67 20 73 20 28 73 6b 20 2e o v () g s (sk .
13e0: 2e 2e 29 20 66 6b 20 69 29 0a 20 20 20 20 20 28 ..) fk i). (
13f0: 69 66 20 28 6e 75 6c 6c 3f 20 76 29 20 28 73 6b if (null? v) (sk
1400: 20 2e 2e 2e 20 69 29 20 66 6b 29 29 0a 20 20 20 ... i) fk)).
1410: 20 28 28 6d 61 74 63 68 2d 74 77 6f 20 76 20 28 ((match-two v (
1420: 71 75 6f 74 65 20 70 29 20 67 20 73 20 28 73 6b quote p) g s (sk
1430: 20 2e 2e 2e 29 20 66 6b 20 69 29 0a 20 20 20 20 ...) fk i).
1440: 20 28 69 66 20 28 65 71 75 61 6c 3f 20 76 20 27 (if (equal? v '
1450: 70 29 20 28 73 6b 20 2e 2e 2e 20 69 29 20 66 6b p) (sk ... i) fk
1460: 29 29 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 )). ((match-t
1470: 77 6f 20 76 20 28 71 75 61 73 69 71 75 6f 74 65 wo v (quasiquote
1480: 20 70 29 20 67 20 73 20 73 6b 20 66 6b 20 69 29 p) g s sk fk i)
1490: 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 71 75 61 . (match-qua
14a0: 73 69 71 75 6f 74 65 20 76 20 70 20 67 20 73 20 siquote v p g s
14b0: 73 6b 20 66 6b 20 69 29 29 0a 20 20 20 20 28 28 sk fk i)). ((
14c0: 6d 61 74 63 68 2d 74 77 6f 20 76 20 28 61 6e 64 match-two v (and
14d0: 29 20 67 20 73 20 28 73 6b 20 2e 2e 2e 29 20 66 ) g s (sk ...) f
14e0: 6b 20 69 29 20 28 73 6b 20 2e 2e 2e 20 69 29 29 k i) (sk ... i))
14f0: 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 77 6f . ((match-two
1500: 20 76 20 28 61 6e 64 20 70 20 71 20 2e 2e 2e 29 v (and p q ...)
1510: 20 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 g s sk fk i).
1520: 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 76 20 (match-one v
1530: 70 20 67 20 73 20 28 6d 61 74 63 68 2d 6f 6e 65 p g s (match-one
1540: 20 76 20 28 61 6e 64 20 71 20 2e 2e 2e 29 20 67 v (and q ...) g
1550: 20 73 20 73 6b 20 66 6b 29 20 66 6b 20 69 29 29 s sk fk) fk i))
1560: 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 77 6f . ((match-two
1570: 20 76 20 28 6f 72 29 20 67 20 73 20 73 6b 20 66 v (or) g s sk f
1580: 6b 20 69 29 20 66 6b 29 0a 20 20 20 20 28 28 6d k i) fk). ((m
1590: 61 74 63 68 2d 74 77 6f 20 76 20 28 6f 72 20 70 atch-two v (or p
15a0: 29 20 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 ) g s sk fk i).
15b0: 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 76 (match-one v
15c0: 20 70 20 67 20 73 20 73 6b 20 66 6b 20 69 29 29 p g s sk fk i))
15d0: 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 77 6f . ((match-two
15e0: 20 76 20 28 6f 72 20 70 20 2e 2e 2e 29 20 67 20 v (or p ...) g
15f0: 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 s sk fk i).
1600: 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 (match-extract-v
1610: 61 72 73 20 28 6f 72 20 70 20 2e 2e 2e 29 0a 20 ars (or p ...).
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1630: 20 20 20 20 20 20 20 20 28 6d 61 74 63 68 2d 67 (match-g
1640: 65 6e 2d 6f 72 20 76 20 28 70 20 2e 2e 2e 29 20 en-or v (p ...)
1650: 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 g s sk fk i).
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1670: 20 20 20 20 20 20 69 0a 20 20 20 20 20 20 20 20 i.
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1690: 20 28 29 29 29 0a 20 20 20 20 28 28 6d 61 74 63 ())). ((matc
16a0: 68 2d 74 77 6f 20 76 20 28 6e 6f 74 20 70 29 20 h-two v (not p)
16b0: 67 20 73 20 28 73 6b 20 2e 2e 2e 29 20 66 6b 20 g s (sk ...) fk
16c0: 69 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 6f i). (match-o
16d0: 6e 65 20 76 20 70 20 67 20 73 20 28 6d 61 74 63 ne v p g s (matc
16e0: 68 2d 64 72 6f 70 2d 69 64 73 20 66 6b 29 20 28 h-drop-ids fk) (
16f0: 73 6b 20 2e 2e 2e 20 69 29 20 69 29 29 0a 20 20 sk ... i) i)).
1700: 20 20 28 28 6d 61 74 63 68 2d 74 77 6f 20 76 20 ((match-two v
1710: 28 67 65 74 21 20 67 65 74 74 65 72 29 20 67 20 (get! getter) g
1720: 73 20 28 73 6b 20 2e 2e 2e 29 20 66 6b 20 69 29 s (sk ...) fk i)
1730: 0a 20 20 20 20 20 28 6c 65 74 20 28 28 67 65 74 . (let ((get
1740: 74 65 72 20 28 6c 61 6d 62 64 61 20 28 29 20 67 ter (lambda () g
1750: 29 29 29 20 28 73 6b 20 2e 2e 2e 20 69 29 29 29 ))) (sk ... i)))
1760: 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 77 6f . ((match-two
1770: 20 76 20 28 73 65 74 21 20 73 65 74 74 65 72 29 v (set! setter)
1780: 20 67 20 28 73 20 2e 2e 2e 29 20 28 73 6b 20 2e g (s ...) (sk .
1790: 2e 2e 29 20 66 6b 20 69 29 0a 20 20 20 20 20 28 ..) fk i). (
17a0: 6c 65 74 20 28 28 73 65 74 74 65 72 20 28 6c 61 let ((setter (la
17b0: 6d 62 64 61 20 28 78 29 20 28 73 20 2e 2e 2e 20 mbda (x) (s ...
17c0: 78 29 29 29 29 20 28 73 6b 20 2e 2e 2e 20 69 29 x)))) (sk ... i)
17d0: 29 29 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 )). ((match-t
17e0: 77 6f 20 76 20 28 3f 20 70 72 65 64 20 70 20 2e wo v (? pred p .
17f0: 2e 2e 29 20 67 20 73 20 73 6b 20 66 6b 20 69 29 ..) g s sk fk i)
1800: 0a 20 20 20 20 20 28 69 66 20 28 70 72 65 64 20 . (if (pred
1810: 76 29 20 28 6d 61 74 63 68 2d 6f 6e 65 20 76 20 v) (match-one v
1820: 28 61 6e 64 20 70 20 2e 2e 2e 29 20 67 20 73 20 (and p ...) g s
1830: 73 6b 20 66 6b 20 69 29 20 66 6b 29 29 0a 20 20 sk fk i) fk)).
1840: 20 20 28 28 6d 61 74 63 68 2d 74 77 6f 20 76 20 ((match-two v
1850: 28 3d 20 70 72 6f 63 20 70 29 20 67 20 73 20 73 (= proc p) g s s
1860: 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 28 6c 65 k fk i). (le
1870: 74 20 28 28 77 20 28 70 72 6f 63 20 76 29 29 29 t ((w (proc v)))
1880: 0a 20 20 20 20 20 20 20 28 6d 61 74 63 68 2d 6f . (match-o
1890: 6e 65 20 77 20 70 20 67 20 73 20 73 6b 20 66 6b ne w p g s sk fk
18a0: 20 69 29 29 29 0a 20 20 20 20 28 28 6d 61 74 63 i))). ((matc
18b0: 68 2d 74 77 6f 20 76 20 28 70 20 5f 5f 5f 20 2e h-two v (p ___ .
18c0: 20 72 29 20 67 20 73 20 73 6b 20 66 6b 20 69 29 r) g s sk fk i)
18d0: 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 65 78 74 . (match-ext
18e0: 72 61 63 74 2d 76 61 72 73 20 70 20 28 6d 61 74 ract-vars p (mat
18f0: 63 68 2d 67 65 6e 2d 65 6c 6c 69 70 73 65 73 20 ch-gen-ellipses
1900: 76 20 70 20 72 20 67 20 73 20 73 6b 20 66 6b 20 v p r g s sk fk
1910: 69 29 20 69 20 28 29 29 29 0a 20 20 20 20 28 28 i) i ())). ((
1920: 6d 61 74 63 68 2d 74 77 6f 20 76 20 28 70 29 20 match-two v (p)
1930: 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 g s sk fk i).
1940: 20 20 28 69 66 20 28 61 6e 64 20 28 70 61 69 72 (if (and (pair
1950: 3f 20 76 29 20 28 6e 75 6c 6c 3f 20 28 63 64 72 ? v) (null? (cdr
1960: 20 76 29 29 29 0a 20 20 20 20 20 20 20 28 6c 65 v))). (le
1970: 74 20 28 28 77 20 28 63 61 72 20 76 29 29 29 0a t ((w (car v))).
1980: 20 20 20 20 20 20 20 20 20 28 6d 61 74 63 68 2d (match-
1990: 6f 6e 65 20 77 20 70 20 28 63 61 72 20 76 29 20 one w p (car v)
19a0: 28 73 65 74 2d 63 61 72 21 20 76 29 20 73 6b 20 (set-car! v) sk
19b0: 66 6b 20 69 29 29 0a 20 20 20 20 20 20 20 66 6b fk i)). fk
19c0: 29 29 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 74 )). ((match-t
19d0: 77 6f 20 76 20 28 70 20 2e 20 71 29 20 67 20 73 wo v (p . q) g s
19e0: 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 28 sk fk i). (
19f0: 69 66 20 28 70 61 69 72 3f 20 76 29 0a 20 20 20 if (pair? v).
1a00: 20 20 20 20 28 6c 65 74 20 28 28 77 20 28 63 61 (let ((w (ca
1a10: 72 20 76 29 29 20 28 78 20 28 63 64 72 20 76 29 r v)) (x (cdr v)
1a20: 29 29 0a 20 20 20 20 20 20 20 20 20 28 6d 61 74 )). (mat
1a30: 63 68 2d 6f 6e 65 20 77 20 70 20 28 63 61 72 20 ch-one w p (car
1a40: 76 29 20 28 73 65 74 2d 63 61 72 21 20 76 29 0a v) (set-car! v).
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a60: 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 78 (match-one x
1a70: 20 71 20 28 63 64 72 20 76 29 20 28 73 65 74 2d q (cdr v) (set-
1a80: 63 64 72 21 20 76 29 20 73 6b 20 66 6b 29 0a 20 cdr! v) sk fk).
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1aa0: 20 20 20 66 6b 0a 20 20 20 20 20 20 20 20 20 20 fk.
1ab0: 20 20 20 20 20 20 20 20 20 20 69 29 29 0a 20 20 i)).
1ac0: 20 20 20 20 20 66 6b 29 29 0a 20 20 20 20 28 28 fk)). ((
1ad0: 6d 61 74 63 68 2d 74 77 6f 20 76 20 23 28 70 20 match-two v #(p
1ae0: 2e 2e 2e 29 20 67 20 73 20 73 6b 20 66 6b 20 69 ...) g s sk fk i
1af0: 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 76 65 ). (match-ve
1b00: 63 74 6f 72 20 76 20 30 20 28 29 20 28 70 20 2e ctor v 0 () (p .
1b10: 2e 2e 29 20 73 6b 20 66 6b 20 69 29 29 0a 20 20 ..) sk fk i)).
1b20: 20 20 28 28 6d 61 74 63 68 2d 74 77 6f 20 76 20 ((match-two v
1b30: 5f 20 67 20 73 20 28 73 6b 20 2e 2e 2e 29 20 66 _ g s (sk ...) f
1b40: 6b 20 69 29 20 28 73 6b 20 2e 2e 2e 20 69 29 29 k i) (sk ... i))
1b50: 0a 20 20 20 20 3b 3b 20 4e 6f 74 20 61 20 70 61 . ;; Not a pa
1b60: 69 72 20 6f 72 20 76 65 63 74 6f 72 20 6f 72 20 ir or vector or
1b70: 73 70 65 63 69 61 6c 20 6c 69 74 65 72 61 6c 2c special literal,
1b80: 20 74 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 test to see if
1b90: 69 74 27 73 20 61 0a 20 20 20 20 3b 3b 20 6e 65 it's a. ;; ne
1ba0: 77 20 73 79 6d 62 6f 6c 2c 20 69 6e 20 77 68 69 w symbol, in whi
1bb0: 63 68 20 63 61 73 65 20 77 65 20 6a 75 73 74 20 ch case we just
1bc0: 62 69 6e 64 20 69 74 2c 20 6f 72 20 69 66 20 69 bind it, or if i
1bd0: 74 27 73 20 61 6e 0a 20 20 20 20 3b 3b 20 61 6c t's an. ;; al
1be0: 72 65 61 64 79 20 62 6f 75 6e 64 20 73 79 6d 62 ready bound symb
1bf0: 6f 6c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 ol or some other
1c00: 20 6c 69 74 65 72 61 6c 2c 20 69 6e 20 77 68 69 literal, in whi
1c10: 63 68 20 63 61 73 65 20 77 65 0a 20 20 20 20 3b ch case we. ;
1c20: 3b 20 63 6f 6d 70 61 72 65 20 69 74 20 77 69 74 ; compare it wit
1c30: 68 20 45 51 55 41 4c 3f 2e 0a 20 20 20 20 28 28 h EQUAL?.. ((
1c40: 6d 61 74 63 68 2d 74 77 6f 20 76 20 78 20 67 20 match-two v x g
1c50: 73 20 28 73 6b 20 2e 2e 2e 29 20 66 6b 20 28 69 s (sk ...) fk (i
1c60: 64 20 2e 2e 2e 29 29 0a 20 20 20 20 20 28 6c 65 d ...)). (le
1c70: 74 2d 73 79 6e 74 61 78 0a 20 20 20 20 20 20 20 t-syntax.
1c80: 20 20 28 28 6e 65 77 2d 73 79 6d 3f 0a 20 20 20 ((new-sym?.
1c90: 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 2d (syntax-
1ca0: 72 75 6c 65 73 20 28 69 64 20 2e 2e 2e 29 0a 20 rules (id ...).
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6e 65 ((ne
1cc0: 77 2d 73 79 6d 3f 20 78 20 73 6b 32 20 66 6b 32 w-sym? x sk2 fk2
1cd0: 29 20 73 6b 32 29 0a 20 20 20 20 20 20 20 20 20 ) sk2).
1ce0: 20 20 20 20 28 28 6e 65 77 2d 73 79 6d 3f 20 79 ((new-sym? y
1cf0: 20 73 6b 32 20 66 6b 32 29 20 66 6b 32 29 29 29 sk2 fk2) fk2)))
1d00: 29 0a 20 20 20 20 20 20 20 28 6e 65 77 2d 73 79 ). (new-sy
1d10: 6d 3f 20 72 61 6e 64 6f 6d 2d 73 79 6d 2d 74 6f m? random-sym-to
1d20: 2d 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 -match.
1d30: 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 78 (let ((x
1d40: 20 76 29 29 20 28 73 6b 20 2e 2e 2e 20 28 69 64 v)) (sk ... (id
1d50: 20 2e 2e 2e 20 78 29 29 29 0a 20 20 20 20 20 20 ... x))).
1d60: 20 20 20 20 20 20 20 20 20 20 20 28 69 66 20 28 (if (
1d70: 65 71 75 61 6c 3f 20 76 20 78 29 20 28 73 6b 20 equal? v x) (sk
1d80: 2e 2e 2e 20 28 69 64 20 2e 2e 2e 29 29 20 66 6b ... (id ...)) fk
1d90: 29 29 29 29 0a 20 20 20 20 29 29 0a 0a 3b 3b 20 )))). ))..;;
1da0: 51 55 41 53 49 51 55 4f 54 45 20 70 61 74 74 65 QUASIQUOTE patte
1db0: 72 6e 73 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e rns..(define-syn
1dc0: 74 61 78 20 6d 61 74 63 68 2d 71 75 61 73 69 71 tax match-quasiq
1dd0: 75 6f 74 65 0a 20 20 28 73 79 6e 74 61 78 2d 72 uote. (syntax-r
1de0: 75 6c 65 73 20 28 75 6e 71 75 6f 74 65 20 75 6e ules (unquote un
1df0: 71 75 6f 74 65 2d 73 70 6c 69 63 69 6e 67 20 71 quote-splicing q
1e00: 75 61 73 69 71 75 6f 74 65 29 0a 20 20 20 20 28 uasiquote). (
1e10: 28 5f 20 76 20 28 75 6e 71 75 6f 74 65 20 70 29 (_ v (unquote p)
1e20: 20 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 g s sk fk i).
1e30: 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 76 20 (match-one v
1e40: 70 20 67 20 73 20 73 6b 20 66 6b 20 69 29 29 0a p g s sk fk i)).
1e50: 20 20 20 20 28 28 5f 20 76 20 28 28 75 6e 71 75 ((_ v ((unqu
1e60: 6f 74 65 2d 73 70 6c 69 63 69 6e 67 20 70 29 20 ote-splicing p)
1e70: 2e 20 72 65 73 74 29 20 67 20 73 20 73 6b 20 66 . rest) g s sk f
1e80: 6b 20 69 29 0a 20 20 20 20 20 28 69 66 20 28 70 k i). (if (p
1e90: 61 69 72 3f 20 76 29 0a 20 20 20 20 20 20 20 28 air? v). (
1ea0: 6d 61 74 63 68 2d 6f 6e 65 20 76 0a 20 20 20 20 match-one v.
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 (p
1ec0: 20 2e 20 74 6d 70 29 0a 20 20 20 20 20 20 20 20 . tmp).
1ed0: 20 20 20 20 20 20 20 20 20 20 28 6d 61 74 63 68 (match
1ee0: 2d 71 75 61 73 69 71 75 6f 74 65 20 74 6d 70 20 -quasiquote tmp
1ef0: 72 65 73 74 20 67 20 73 20 73 6b 20 66 6b 29 0a rest g s sk fk).
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f10: 20 20 66 6b 0a 20 20 20 20 20 20 20 20 20 20 20 fk.
1f20: 20 20 20 20 20 20 20 69 29 0a 20 20 20 20 20 20 i).
1f30: 20 66 6b 29 29 0a 20 20 20 20 28 28 5f 20 76 20 fk)). ((_ v
1f40: 28 71 75 61 73 69 71 75 6f 74 65 20 70 29 20 67 (quasiquote p) g
1f50: 20 73 20 73 6b 20 66 6b 20 69 20 2e 20 64 65 70 s sk fk i . dep
1f60: 74 68 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d th). (match-
1f70: 71 75 61 73 69 71 75 6f 74 65 20 76 20 70 20 67 quasiquote v p g
1f80: 20 73 20 73 6b 20 66 6b 20 69 20 23 66 20 2e 20 s sk fk i #f .
1f90: 64 65 70 74 68 29 29 0a 20 20 20 20 28 28 5f 20 depth)). ((_
1fa0: 76 20 28 75 6e 71 75 6f 74 65 20 70 29 20 67 20 v (unquote p) g
1fb0: 73 20 73 6b 20 66 6b 20 69 20 78 20 2e 20 64 65 s sk fk i x . de
1fc0: 70 74 68 29 0a 20 20 20 20 20 28 6d 61 74 63 68 pth). (match
1fd0: 2d 71 75 61 73 69 71 75 6f 74 65 20 76 20 70 20 -quasiquote v p
1fe0: 67 20 73 20 73 6b 20 66 6b 20 69 20 2e 20 64 65 g s sk fk i . de
1ff0: 70 74 68 29 29 0a 20 20 20 20 28 28 5f 20 76 20 pth)). ((_ v
2000: 28 75 6e 71 75 6f 74 65 2d 73 70 6c 69 63 69 6e (unquote-splicin
2010: 67 20 70 29 20 67 20 73 20 73 6b 20 66 6b 20 69 g p) g s sk fk i
2020: 20 78 20 2e 20 64 65 70 74 68 29 0a 20 20 20 20 x . depth).
2030: 20 28 6d 61 74 63 68 2d 71 75 61 73 69 71 75 6f (match-quasiquo
2040: 74 65 20 76 20 70 20 67 20 73 20 73 6b 20 66 6b te v p g s sk fk
2050: 20 69 20 2e 20 64 65 70 74 68 29 29 0a 20 20 20 i . depth)).
2060: 20 28 28 5f 20 76 20 28 70 20 2e 20 71 29 20 67 ((_ v (p . q) g
2070: 20 73 20 73 6b 20 66 6b 20 69 20 2e 20 64 65 70 s sk fk i . dep
2080: 74 68 29 0a 20 20 20 20 20 28 69 66 20 28 70 61 th). (if (pa
2090: 69 72 3f 20 76 29 0a 20 20 20 20 20 20 20 28 6c ir? v). (l
20a0: 65 74 20 28 28 77 20 28 63 61 72 20 76 29 29 20 et ((w (car v))
20b0: 28 78 20 28 63 64 72 20 76 29 29 29 0a 20 20 20 (x (cdr v))).
20c0: 20 20 20 20 20 20 28 6d 61 74 63 68 2d 71 75 61 (match-qua
20d0: 73 69 71 75 6f 74 65 0a 20 20 20 20 20 20 20 20 siquote.
20e0: 20 20 77 20 70 20 67 20 73 0a 20 20 20 20 20 20 w p g s.
20f0: 20 20 20 20 28 6d 61 74 63 68 2d 71 75 61 73 69 (match-quasi
2100: 71 75 6f 74 65 2d 73 74 65 70 20 78 20 71 20 67 quote-step x q g
2110: 20 73 20 73 6b 20 66 6b 20 64 65 70 74 68 29 0a s sk fk depth).
2120: 20 20 20 20 20 20 20 20 20 20 66 6b 20 69 20 2e fk i .
2130: 20 64 65 70 74 68 29 29 0a 20 20 20 20 20 20 20 depth)).
2140: 66 6b 29 29 0a 20 20 20 20 28 28 5f 20 76 20 23 fk)). ((_ v #
2150: 28 65 6c 74 20 2e 2e 2e 29 20 67 20 73 20 73 6b (elt ...) g s sk
2160: 20 66 6b 20 69 20 2e 20 64 65 70 74 68 29 0a 20 fk i . depth).
2170: 20 20 20 20 28 69 66 20 28 76 65 63 74 6f 72 3f (if (vector?
2180: 20 76 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 v). (let
2190: 28 28 6c 73 20 28 76 65 63 74 6f 72 2d 3e 6c 69 ((ls (vector->li
21a0: 73 74 20 76 29 29 29 0a 20 20 20 20 20 20 20 20 st v))).
21b0: 20 28 6d 61 74 63 68 2d 71 75 61 73 69 71 75 6f (match-quasiquo
21c0: 74 65 20 6c 73 20 28 65 6c 74 20 2e 2e 2e 29 20 te ls (elt ...)
21d0: 67 20 73 20 73 6b 20 66 6b 20 69 20 2e 20 64 65 g s sk fk i . de
21e0: 70 74 68 29 29 0a 20 20 20 20 20 20 20 66 6b 29 pth)). fk)
21f0: 29 0a 20 20 20 20 28 28 5f 20 76 20 78 20 67 20 ). ((_ v x g
2200: 73 20 73 6b 20 66 6b 20 69 20 2e 20 64 65 70 74 s sk fk i . dept
2210: 68 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 6f h). (match-o
2220: 6e 65 20 76 20 27 78 20 67 20 73 20 73 6b 20 66 ne v 'x g s sk f
2230: 6b 20 69 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 k i))))..(define
2240: 2d 73 79 6e 74 61 78 20 6d 61 74 63 68 2d 71 75 -syntax match-qu
2250: 61 73 69 71 75 6f 74 65 2d 73 74 65 70 0a 20 20 asiquote-step.
2260: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 (syntax-rules ()
2270: 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 71 75 61 . ((match-qua
2280: 73 69 71 75 6f 74 65 2d 73 74 65 70 20 78 20 71 siquote-step x q
2290: 20 67 20 73 20 73 6b 20 66 6b 20 64 65 70 74 68 g s sk fk depth
22a0: 20 69 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d i). (match-
22b0: 71 75 61 73 69 71 75 6f 74 65 20 78 20 71 20 67 quasiquote x q g
22c0: 20 73 20 73 6b 20 66 6b 20 69 20 2e 20 64 65 70 s sk fk i . dep
22d0: 74 68 29 29 0a 20 20 20 20 29 29 0a 0a 3b 3b 3b th)). ))..;;;
22e0: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
22f0: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
2300: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
2310: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
2320: 3b 3b 3b 3b 3b 0a 3b 3b 20 55 74 69 6c 69 74 69 ;;;;;.;; Utiliti
2330: 65 73 0a 0a 3b 3b 20 41 20 43 50 53 20 75 74 69 es..;; A CPS uti
2340: 6c 69 74 79 20 74 68 61 74 20 74 61 6b 65 73 20 lity that takes
2350: 74 77 6f 20 76 61 6c 75 65 73 20 61 6e 64 20 6a two values and j
2360: 75 73 74 20 65 78 70 61 6e 64 73 20 69 6e 74 6f ust expands into
2370: 20 74 68 65 0a 3b 3b 20 66 69 72 73 74 2e 0a 28 the.;; first..(
2380: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 define-syntax ma
2390: 74 63 68 2d 64 72 6f 70 2d 69 64 73 0a 20 20 28 tch-drop-ids. (
23a0: 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a syntax-rules ().
23b0: 20 20 20 20 28 28 5f 20 65 78 70 72 20 69 64 73 ((_ expr ids
23c0: 20 2e 2e 2e 29 20 65 78 70 72 29 29 29 0a 0a 3b ...) expr)))..;
23d0: 3b 20 47 65 6e 65 72 61 74 69 6e 67 20 4f 52 20 ; Generating OR
23e0: 63 6c 61 75 73 65 73 20 6a 75 73 74 20 69 6e 76 clauses just inv
23f0: 6f 6c 76 65 73 20 62 69 6e 64 69 6e 67 20 74 68 olves binding th
2400: 65 20 73 75 63 63 65 73 73 0a 3b 3b 20 63 6f 6e e success.;; con
2410: 74 69 6e 75 61 74 69 6f 6e 20 69 6e 74 6f 20 61 tinuation into a
2420: 20 74 68 75 6e 6b 20 77 68 69 63 68 20 74 61 6b thunk which tak
2430: 65 73 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 es the identifie
2440: 72 73 20 63 6f 6d 6d 6f 6e 20 74 6f 0a 3b 3b 20 rs common to.;;
2450: 65 61 63 68 20 4f 52 20 63 6c 61 75 73 65 2c 20 each OR clause,
2460: 61 6e 64 20 74 72 79 69 6e 67 20 65 61 63 68 20 and trying each
2470: 63 6c 61 75 73 65 2c 20 63 61 6c 6c 69 6e 67 20 clause, calling
2480: 74 68 65 20 74 68 75 6e 6b 20 61 73 20 73 6f 6f the thunk as soo
2490: 6e 0a 3b 3b 20 61 73 20 77 65 20 73 75 63 63 65 n.;; as we succe
24a0: 65 64 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e ed...(define-syn
24b0: 74 61 78 20 6d 61 74 63 68 2d 67 65 6e 2d 6f 72 tax match-gen-or
24c0: 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 . (syntax-rules
24d0: 20 28 29 0a 20 20 20 20 28 28 5f 20 76 20 70 20 (). ((_ v p
24e0: 67 20 73 20 28 73 6b 20 2e 2e 2e 29 20 66 6b 20 g s (sk ...) fk
24f0: 28 69 20 2e 2e 2e 29 20 28 28 69 64 20 69 64 2d (i ...) ((id id-
2500: 6c 73 29 20 2e 2e 2e 29 29 0a 20 20 20 20 20 28 ls) ...)). (
2510: 6c 65 74 20 28 28 73 6b 32 20 28 6c 61 6d 62 64 let ((sk2 (lambd
2520: 61 20 28 69 64 20 2e 2e 2e 29 20 28 73 6b 20 2e a (id ...) (sk .
2530: 2e 2e 20 28 69 20 2e 2e 2e 20 69 64 20 2e 2e 2e .. (i ... id ...
2540: 29 29 29 29 29 0a 20 20 20 20 20 20 20 28 6d 61 ))))). (ma
2550: 74 63 68 2d 67 65 6e 2d 6f 72 2d 73 74 65 70 0a tch-gen-or-step.
2560: 20 20 20 20 20 20 20 20 76 20 70 20 67 20 73 20 v p g s
2570: 28 6d 61 74 63 68 2d 64 72 6f 70 2d 69 64 73 20 (match-drop-ids
2580: 28 73 6b 32 20 69 64 20 2e 2e 2e 29 29 20 66 6b (sk2 id ...)) fk
2590: 20 28 69 20 2e 2e 2e 29 29 29 29 29 29 0a 0a 28 (i ...))))))..(
25a0: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 define-syntax ma
25b0: 74 63 68 2d 67 65 6e 2d 6f 72 2d 73 74 65 70 0a tch-gen-or-step.
25c0: 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 (syntax-rules
25d0: 28 29 0a 20 20 20 20 28 28 5f 20 76 20 28 29 20 (). ((_ v ()
25e0: 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 g s sk fk i).
25f0: 20 20 3b 3b 20 6e 6f 20 4f 52 20 63 6c 61 75 73 ;; no OR claus
2600: 65 73 2c 20 63 61 6c 6c 20 74 68 65 20 66 61 69 es, call the fai
2610: 6c 75 72 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f lure continuatio
2620: 6e 0a 20 20 20 20 20 66 6b 29 0a 20 20 20 20 28 n. fk). (
2630: 28 5f 20 76 20 28 70 29 20 67 20 73 20 73 6b 20 (_ v (p) g s sk
2640: 66 6b 20 69 29 0a 20 20 20 20 20 3b 3b 20 6c 61 fk i). ;; la
2650: 73 74 20 28 6f 72 20 6f 6e 6c 79 29 20 4f 52 20 st (or only) OR
2660: 63 6c 61 75 73 65 2c 20 6a 75 73 74 20 65 78 70 clause, just exp
2670: 61 6e 64 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 20 and normally.
2680: 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 76 20 70 (match-one v p
2690: 20 67 20 73 20 73 6b 20 66 6b 20 69 29 29 0a 20 g s sk fk i)).
26a0: 20 20 20 28 28 5f 20 76 20 28 70 20 2e 20 71 29 ((_ v (p . q)
26b0: 20 67 20 73 20 73 6b 20 66 6b 20 69 29 0a 20 20 g s sk fk i).
26c0: 20 20 20 3b 3b 20 6d 61 74 63 68 20 6f 6e 65 20 ;; match one
26d0: 61 6e 64 20 74 72 79 20 74 68 65 20 72 65 6d 61 and try the rema
26e0: 69 6e 69 6e 67 20 6f 6e 20 66 61 69 6c 75 72 65 ining on failure
26f0: 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 . (match-one
2700: 20 76 20 70 20 67 20 73 20 73 6b 20 28 6d 61 74 v p g s sk (mat
2710: 63 68 2d 67 65 6e 2d 6f 72 2d 73 74 65 70 20 76 ch-gen-or-step v
2720: 20 71 20 67 20 73 20 73 6b 20 66 6b 20 69 29 20 q g s sk fk i)
2730: 69 29 29 0a 20 20 20 20 29 29 0a 0a 3b 3b 20 57 i)). ))..;; W
2740: 65 20 6d 61 74 63 68 20 61 20 70 61 74 74 65 72 e match a patter
2750: 6e 20 28 70 20 2e 2e 2e 29 20 62 79 20 6d 61 74 n (p ...) by mat
2760: 63 68 69 6e 67 20 74 68 65 20 70 61 74 74 65 72 ching the patter
2770: 6e 20 70 20 69 6e 20 61 20 6c 6f 6f 70 20 6f 6e n p in a loop on
2780: 0a 3b 3b 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 .;; each element
2790: 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 of the variable
27a0: 2c 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 74 , accumulating t
27b0: 68 65 20 62 6f 75 6e 64 20 69 64 73 20 69 6e 74 he bound ids int
27c0: 6f 20 6c 69 73 74 73 2e 0a 0a 3b 3b 20 4c 6f 6f o lists...;; Loo
27d0: 6b 20 61 74 20 74 68 65 20 62 6f 64 79 20 2d 20 k at the body -
27e0: 69 74 27 73 20 6a 75 73 74 20 61 20 6e 61 6d 65 it's just a name
27f0: 64 20 6c 65 74 20 6c 6f 6f 70 2c 20 6d 61 74 63 d let loop, matc
2800: 68 69 6e 67 20 65 61 63 68 0a 3b 3b 20 65 6c 65 hing each.;; ele
2810: 6d 65 6e 74 20 69 6e 20 74 75 72 6e 20 74 6f 20 ment in turn to
2820: 74 68 65 20 73 61 6d 65 20 70 61 74 74 65 72 6e the same pattern
2830: 2e 20 20 54 68 69 73 20 69 6c 6c 75 73 74 72 61 . This illustra
2840: 74 65 73 20 74 68 65 0a 3b 3b 20 73 69 6d 70 6c tes the.;; simpl
2850: 69 63 69 74 79 20 6f 66 20 74 68 69 73 20 67 65 icity of this ge
2860: 6e 65 72 61 74 69 76 65 2d 73 74 79 6c 65 20 70 nerative-style p
2870: 61 74 74 65 72 6e 20 6d 61 74 63 68 69 6e 67 2e attern matching.
2880: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 0a 3b 3b It would be.;;
2890: 20 6a 75 73 74 20 61 73 20 65 61 73 79 20 74 6f just as easy to
28a0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 74 72 65 implement a tre
28b0: 65 20 73 65 61 72 63 68 69 6e 67 20 70 61 74 74 e searching patt
28c0: 65 72 6e 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 79 ern...(define-sy
28d0: 6e 74 61 78 20 6d 61 74 63 68 2d 67 65 6e 2d 65 ntax match-gen-e
28e0: 6c 6c 69 70 73 65 73 0a 20 20 28 73 79 6e 74 61 llipses. (synta
28f0: 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 x-rules (). (
2900: 28 5f 20 76 20 70 20 28 29 20 67 20 73 20 28 73 (_ v p () g s (s
2910: 6b 20 2e 2e 2e 29 20 66 6b 20 69 20 28 28 69 64 k ...) fk i ((id
2920: 20 69 64 2d 6c 73 29 20 2e 2e 2e 29 29 0a 20 20 id-ls) ...)).
2930: 20 20 20 28 6d 61 74 63 68 2d 63 68 65 63 6b 2d (match-check-
2940: 69 64 65 6e 74 69 66 69 65 72 20 70 0a 20 20 20 identifier p.
2950: 20 20 20 20 3b 3b 20 73 69 6d 70 6c 65 73 74 20 ;; simplest
2960: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20 case equivalent
2970: 74 6f 20 28 20 2e 20 70 29 2c 20 6a 75 73 74 20 to ( . p), just
2980: 62 69 6e 64 20 74 68 65 20 6c 69 73 74 0a 20 20 bind the list.
2990: 20 20 20 20 20 28 6c 65 74 20 28 28 70 20 76 29 (let ((p v)
29a0: 29 0a 20 20 20 20 20 20 20 20 20 28 69 66 20 28 ). (if (
29b0: 6c 69 73 74 3f 20 70 29 0a 20 20 20 20 20 20 20 list? p).
29c0: 20 20 20 20 20 20 28 73 6b 20 2e 2e 2e 20 69 29 (sk ... i)
29d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6b . fk
29e0: 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 73 69 6d )). ;; sim
29f0: 70 6c 65 20 63 61 73 65 2c 20 6d 61 74 63 68 20 ple case, match
2a00: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 all elements of
2a10: 74 68 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 the list.
2a20: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 73 20 76 (let loop ((ls v
2a30: 29 20 28 69 64 2d 6c 73 20 27 28 29 29 20 2e 2e ) (id-ls '()) ..
2a40: 2e 29 0a 20 20 20 20 20 20 20 20 20 28 63 6f 6e .). (con
2a50: 64 0a 20 20 20 20 20 20 20 20 20 20 20 28 28 6e d. ((n
2a60: 75 6c 6c 3f 20 6c 73 29 0a 20 20 20 20 20 20 20 ull? ls).
2a70: 20 20 20 20 20 28 6c 65 74 20 28 28 69 64 20 28 (let ((id (
2a80: 72 65 76 65 72 73 65 20 69 64 2d 6c 73 29 29 20 reverse id-ls))
2a90: 2e 2e 2e 29 20 28 73 6b 20 2e 2e 2e 20 69 29 29 ...) (sk ... i))
2aa0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 28 70 ). ((p
2ab0: 61 69 72 3f 20 6c 73 29 0a 20 20 20 20 20 20 20 air? ls).
2ac0: 20 20 20 20 20 28 6c 65 74 20 28 28 77 20 28 63 (let ((w (c
2ad0: 61 72 20 6c 73 29 29 29 0a 20 20 20 20 20 20 20 ar ls))).
2ae0: 20 20 20 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e (match-on
2af0: 65 20 77 20 70 20 28 63 61 72 20 6c 73 29 20 28 e w p (car ls) (
2b00: 73 65 74 2d 63 61 72 21 20 6c 73 29 0a 20 20 20 set-car! ls).
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b20: 20 20 20 20 20 20 28 6d 61 74 63 68 2d 64 72 6f (match-dro
2b30: 70 2d 69 64 73 20 28 6c 6f 6f 70 20 28 63 64 72 p-ids (loop (cdr
2b40: 20 6c 73 29 20 28 63 6f 6e 73 20 69 64 20 69 64 ls) (cons id id
2b50: 2d 6c 73 29 20 2e 2e 2e 29 29 0a 20 20 20 20 20 -ls) ...)).
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b70: 20 20 20 20 66 6b 20 69 29 29 29 0a 20 20 20 20 fk i))).
2b80: 20 20 20 20 20 20 20 28 65 6c 73 65 0a 20 20 20 (else.
2b90: 20 20 20 20 20 20 20 20 20 66 6b 29 29 29 29 29 fk)))))
2ba0: 0a 20 20 20 20 28 28 5f 20 76 20 70 20 28 72 20 . ((_ v p (r
2bb0: 2e 2e 2e 29 20 67 20 73 20 28 73 6b 20 2e 2e 2e ...) g s (sk ...
2bc0: 29 20 66 6b 20 69 20 28 28 69 64 20 69 64 2d 6c ) fk i ((id id-l
2bd0: 73 29 20 2e 2e 2e 29 29 0a 20 20 20 20 20 3b 3b s) ...)). ;;
2be0: 20 67 65 6e 65 72 61 6c 20 63 61 73 65 2c 20 74 general case, t
2bf0: 72 61 69 6c 69 6e 67 20 70 61 74 74 65 72 6e 73 railing patterns
2c00: 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 28 to match. (
2c10: 6d 61 74 63 68 2d 76 65 72 69 66 79 2d 6e 6f 2d match-verify-no-
2c20: 65 6c 6c 69 70 73 65 73 0a 20 20 20 20 20 20 28 ellipses. (
2c30: 72 20 2e 2e 2e 29 0a 20 20 20 20 20 20 28 6c 65 r ...). (le
2c40: 74 2a 20 28 28 74 61 69 6c 2d 6c 65 6e 20 28 6c t* ((tail-len (l
2c50: 65 6e 67 74 68 20 27 28 72 20 2e 2e 2e 29 29 29 ength '(r ...)))
2c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c . (l
2c70: 73 20 76 29 0a 20 20 20 20 20 20 20 20 20 20 20 s v).
2c80: 20 20 28 6c 65 6e 20 28 6c 65 6e 67 74 68 20 6c (len (length l
2c90: 73 29 29 29 0a 20 20 20 20 20 20 20 20 28 69 66 s))). (if
2ca0: 20 28 3c 20 6c 65 6e 20 74 61 69 6c 2d 6c 65 6e (< len tail-len
2cb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6b ). fk
2cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 . (le
2cd0: 74 20 6c 6f 6f 70 20 28 28 6c 73 20 6c 73 29 20 t loop ((ls ls)
2ce0: 28 6e 20 6c 65 6e 29 20 28 69 64 2d 6c 73 20 27 (n len) (id-ls '
2cf0: 28 29 29 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 ()) ...).
2d00: 20 20 20 20 20 20 20 28 63 6f 6e 64 0a 20 20 20 (cond.
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 3d ((=
2d20: 20 6e 20 74 61 69 6c 2d 6c 65 6e 29 0a 20 20 20 n tail-len).
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c (l
2d40: 65 74 20 28 28 69 64 20 28 72 65 76 65 72 73 65 et ((id (reverse
2d50: 20 69 64 2d 6c 73 29 29 20 2e 2e 2e 29 0a 20 20 id-ls)) ...).
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2d70: 20 28 6d 61 74 63 68 2d 6f 6e 65 20 6c 73 20 28 (match-one ls (
2d80: 72 20 2e 2e 2e 29 20 23 66 20 23 66 20 28 73 6b r ...) #f #f (sk
2d90: 20 2e 2e 2e 20 69 29 20 66 6b 20 69 29 29 29 0a ... i) fk i))).
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2db0: 28 28 70 61 69 72 3f 20 6c 73 29 0a 20 20 20 20 ((pair? ls).
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 (le
2dd0: 74 20 28 28 77 20 28 63 61 72 20 6c 73 29 29 29 t ((w (car ls)))
2de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2df0: 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 77 (match-one w
2e00: 20 70 20 28 63 61 72 20 6c 73 29 20 28 73 65 74 p (car ls) (set
2e10: 2d 63 61 72 21 20 6c 73 29 0a 20 20 20 20 20 20 -car! ls).
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e30: 20 20 20 20 20 20 20 20 28 6d 61 74 63 68 2d 64 (match-d
2e40: 72 6f 70 2d 69 64 73 0a 20 20 20 20 20 20 20 20 rop-ids.
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e60: 20 20 20 20 20 20 20 28 6c 6f 6f 70 20 28 63 64 (loop (cd
2e70: 72 20 6c 73 29 20 28 2d 20 6e 20 31 29 20 28 63 r ls) (- n 1) (c
2e80: 6f 6e 73 20 69 64 20 69 64 2d 6c 73 29 20 2e 2e ons id id-ls) ..
2e90: 2e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 .)).
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2eb0: 20 20 66 6b 0a 20 20 20 20 20 20 20 20 20 20 20 fk.
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ed0: 20 20 20 69 29 29 29 0a 20 20 20 20 20 20 20 20 i))).
2ee0: 20 20 20 20 20 20 20 20 28 65 6c 73 65 0a 20 20 (else.
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 f
2f00: 6b 29 29 29 29 29 29 29 0a 20 20 20 20 29 29 0a k))))))). )).
2f10: 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 .(define-syntax
2f20: 6d 61 74 63 68 2d 76 65 72 69 66 79 2d 6e 6f 2d match-verify-no-
2f30: 65 6c 6c 69 70 73 65 73 0a 20 20 28 73 79 6e 74 ellipses. (synt
2f40: 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 ax-rules ().
2f50: 28 28 5f 20 28 78 20 2e 20 79 29 20 73 6b 29 0a ((_ (x . y) sk).
2f60: 20 20 20 20 20 28 6d 61 74 63 68 2d 63 68 65 63 (match-chec
2f70: 6b 2d 65 6c 6c 69 70 73 65 0a 20 20 20 20 20 20 k-ellipse.
2f80: 78 0a 20 20 20 20 20 20 28 6d 61 74 63 68 2d 73 x. (match-s
2f90: 79 6e 74 61 78 2d 65 72 72 6f 72 0a 20 20 20 20 yntax-error.
2fa0: 20 20 20 22 6d 75 6c 74 69 70 6c 65 20 65 6c 6c "multiple ell
2fb0: 69 70 73 65 20 70 61 74 74 65 72 6e 73 20 6e 6f ipse patterns no
2fc0: 74 20 61 6c 6c 6f 77 65 64 20 61 74 20 73 61 6d t allowed at sam
2fd0: 65 20 6c 65 76 65 6c 22 29 0a 20 20 20 20 20 20 e level").
2fe0: 28 6d 61 74 63 68 2d 76 65 72 69 66 79 2d 6e 6f (match-verify-no
2ff0: 2d 65 6c 6c 69 70 73 65 73 20 79 20 73 6b 29 29 -ellipses y sk))
3000: 29 0a 20 20 20 20 28 28 5f 20 78 20 73 6b 29 20 ). ((_ x sk)
3010: 73 6b 29 0a 20 20 20 20 29 29 0a 0a 3b 3b 20 56 sk). ))..;; V
3020: 65 63 74 6f 72 20 70 61 74 74 65 72 6e 73 20 61 ector patterns a
3030: 72 65 20 6a 75 73 74 20 6d 6f 72 65 20 6f 66 20 re just more of
3040: 74 68 65 20 73 61 6d 65 2c 20 77 69 74 68 20 74 the same, with t
3050: 68 65 20 73 6c 69 67 68 74 0a 3b 3b 20 65 78 63 he slight.;; exc
3060: 65 70 74 69 6f 6e 20 74 68 61 74 20 77 65 20 70 eption that we p
3070: 61 73 73 20 61 72 6f 75 6e 64 20 74 68 65 20 63 ass around the c
3080: 75 72 72 65 6e 74 20 76 65 63 74 6f 72 20 69 6e urrent vector in
3090: 64 65 78 20 62 65 69 6e 67 0a 3b 3b 20 6d 61 74 dex being.;; mat
30a0: 63 68 65 64 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 ched...(define-s
30b0: 79 6e 74 61 78 20 6d 61 74 63 68 2d 76 65 63 74 yntax match-vect
30c0: 6f 72 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c or. (syntax-rul
30d0: 65 73 20 28 5f 5f 5f 29 0a 20 20 20 20 28 28 5f es (___). ((_
30e0: 20 76 20 6e 20 70 61 74 73 20 28 70 20 71 29 20 v n pats (p q)
30f0: 73 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 28 6d sk fk i). (m
3100: 61 74 63 68 2d 63 68 65 63 6b 2d 65 6c 6c 69 70 atch-check-ellip
3110: 73 65 20 71 0a 20 20 20 20 20 20 20 20 20 20 20 se q.
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
3130: 6d 61 74 63 68 2d 76 65 63 74 6f 72 2d 65 6c 6c match-vector-ell
3140: 69 70 73 65 73 20 76 20 6e 20 70 61 74 73 20 70 ipses v n pats p
3150: 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 20 sk fk i).
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3170: 20 20 20 20 28 6d 61 74 63 68 2d 76 65 63 74 6f (match-vecto
3180: 72 2d 74 77 6f 20 76 20 6e 20 70 61 74 73 20 28 r-two v n pats (
3190: 70 20 71 29 20 73 6b 20 66 6b 20 69 29 29 29 0a p q) sk fk i))).
31a0: 20 20 20 20 28 28 5f 20 76 20 6e 20 70 61 74 73 ((_ v n pats
31b0: 20 28 70 20 5f 5f 5f 29 20 73 6b 20 66 6b 20 69 (p ___) sk fk i
31c0: 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 76 65 ). (match-ve
31d0: 63 74 6f 72 2d 65 6c 6c 69 70 73 65 73 20 76 20 ctor-ellipses v
31e0: 6e 20 70 61 74 73 20 70 20 73 6b 20 66 6b 20 69 n pats p sk fk i
31f0: 29 29 0a 20 20 20 20 28 28 5f 20 2e 20 78 29 0a )). ((_ . x).
3200: 20 20 20 20 20 28 6d 61 74 63 68 2d 76 65 63 74 (match-vect
3210: 6f 72 2d 74 77 6f 20 2e 20 78 29 29 29 29 0a 0a or-two . x))))..
3220: 3b 3b 20 43 68 65 63 6b 20 74 68 65 20 65 78 61 ;; Check the exa
3230: 63 74 20 76 65 63 74 6f 72 20 6c 65 6e 67 74 68 ct vector length
3240: 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 65 61 63 , then check eac
3250: 68 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 75 72 h element in tur
3260: 6e 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 n...(define-synt
3270: 61 78 20 6d 61 74 63 68 2d 76 65 63 74 6f 72 2d ax match-vector-
3280: 74 77 6f 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 two. (syntax-ru
3290: 6c 65 73 20 28 29 0a 20 20 20 20 28 28 5f 20 76 les (). ((_ v
32a0: 20 6e 20 28 28 70 61 74 20 69 6e 64 65 78 29 20 n ((pat index)
32b0: 2e 2e 2e 29 20 28 29 20 73 6b 20 66 6b 20 69 29 ...) () sk fk i)
32c0: 0a 20 20 20 20 20 28 69 66 20 28 76 65 63 74 6f . (if (vecto
32d0: 72 3f 20 76 29 0a 20 20 20 20 20 20 20 28 6c 65 r? v). (le
32e0: 74 20 28 28 6c 65 6e 20 28 76 65 63 74 6f 72 2d t ((len (vector-
32f0: 6c 65 6e 67 74 68 20 76 29 29 29 0a 20 20 20 20 length v))).
3300: 20 20 20 20 20 28 69 66 20 28 3d 20 6c 65 6e 20 (if (= len
3310: 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 28 6d n). (m
3320: 61 74 63 68 2d 76 65 63 74 6f 72 2d 73 74 65 70 atch-vector-step
3330: 20 76 20 28 28 70 61 74 20 69 6e 64 65 78 29 20 v ((pat index)
3340: 2e 2e 2e 29 20 73 6b 20 66 6b 20 69 29 0a 20 20 ...) sk fk i).
3350: 20 20 20 20 20 20 20 20 20 66 6b 29 29 0a 20 20 fk)).
3360: 20 20 20 20 20 66 6b 29 29 0a 20 20 20 20 28 28 fk)). ((
3370: 5f 20 76 20 6e 20 28 70 61 74 73 20 2e 2e 2e 29 _ v n (pats ...)
3380: 20 28 70 20 2e 20 71 29 20 73 6b 20 66 6b 20 69 (p . q) sk fk i
3390: 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 76 65 ). (match-ve
33a0: 63 74 6f 72 20 76 20 28 2b 20 6e 20 31 29 20 28 ctor v (+ n 1) (
33b0: 70 61 74 73 20 2e 2e 2e 20 28 70 20 6e 29 29 20 pats ... (p n))
33c0: 71 20 73 6b 20 66 6b 20 69 29 29 0a 20 20 20 20 q sk fk i)).
33d0: 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 ))..(define-synt
33e0: 61 78 20 6d 61 74 63 68 2d 76 65 63 74 6f 72 2d ax match-vector-
33f0: 73 74 65 70 0a 20 20 28 73 79 6e 74 61 78 2d 72 step. (syntax-r
3400: 75 6c 65 73 20 28 29 0a 20 20 20 20 28 28 5f 20 ules (). ((_
3410: 76 20 28 29 20 28 73 6b 20 2e 2e 2e 29 20 66 6b v () (sk ...) fk
3420: 20 69 29 20 28 73 6b 20 2e 2e 2e 20 69 29 29 0a i) (sk ... i)).
3430: 20 20 20 20 28 28 5f 20 76 20 28 28 70 61 74 20 ((_ v ((pat
3440: 69 6e 64 65 78 29 20 2e 20 72 65 73 74 29 20 73 index) . rest) s
3450: 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 28 6c 65 k fk i). (le
3460: 74 20 28 28 77 20 28 76 65 63 74 6f 72 2d 72 65 t ((w (vector-re
3470: 66 20 76 20 69 6e 64 65 78 29 29 29 0a 20 20 20 f v index))).
3480: 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 20 77 (match-one w
3490: 20 70 61 74 20 28 76 65 63 74 6f 72 2d 72 65 66 pat (vector-ref
34a0: 20 76 20 69 6e 64 65 78 29 20 28 76 65 63 74 6f v index) (vecto
34b0: 72 2d 73 65 74 21 20 76 20 69 6e 64 65 78 29 0a r-set! v index).
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
34d0: 20 20 28 6d 61 74 63 68 2d 76 65 63 74 6f 72 2d (match-vector-
34e0: 73 74 65 70 20 76 20 72 65 73 74 20 73 6b 20 66 step v rest sk f
34f0: 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 k).
3500: 20 20 20 20 20 66 6b 20 69 29 29 29 29 29 0a 0a fk i)))))..
3510: 3b 3b 20 57 69 74 68 20 61 20 76 65 63 74 6f 72 ;; With a vector
3520: 20 65 6c 6c 69 70 73 65 20 70 61 74 74 65 72 6e ellipse pattern
3530: 20 77 65 20 66 69 72 73 74 20 63 68 65 63 6b 20 we first check
3540: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 76 65 to see if the ve
3550: 63 74 6f 72 0a 3b 3b 20 6c 65 6e 67 74 68 20 69 ctor.;; length i
3560: 73 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 72 s at least the r
3570: 65 71 75 69 72 65 64 20 6c 65 6e 67 74 68 2e 0a equired length..
3580: 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 .(define-syntax
3590: 6d 61 74 63 68 2d 76 65 63 74 6f 72 2d 65 6c 6c match-vector-ell
35a0: 69 70 73 65 73 0a 20 20 28 73 79 6e 74 61 78 2d ipses. (syntax-
35b0: 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 28 5f rules (). ((_
35c0: 20 76 20 6e 20 28 28 70 61 74 20 69 6e 64 65 78 v n ((pat index
35d0: 29 20 2e 2e 2e 29 20 70 20 73 6b 20 66 6b 20 69 ) ...) p sk fk i
35e0: 29 0a 20 20 20 20 20 28 69 66 20 28 76 65 63 74 ). (if (vect
35f0: 6f 72 3f 20 76 29 0a 20 20 20 20 20 20 20 28 6c or? v). (l
3600: 65 74 20 28 28 6c 65 6e 20 28 76 65 63 74 6f 72 et ((len (vector
3610: 2d 6c 65 6e 67 74 68 20 76 29 29 29 0a 20 20 20 -length v))).
3620: 20 20 20 20 20 20 28 69 66 20 28 3e 3d 20 6c 65 (if (>= le
3630: 6e 20 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 n n).
3640: 28 6d 61 74 63 68 2d 76 65 63 74 6f 72 2d 73 74 (match-vector-st
3650: 65 70 20 76 20 28 28 70 61 74 20 69 6e 64 65 78 ep v ((pat index
3660: 29 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 20 ) ...).
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3680: 20 20 20 20 20 28 6d 61 74 63 68 2d 76 65 63 74 (match-vect
3690: 6f 72 2d 74 61 69 6c 20 76 20 70 20 6e 20 6c 65 or-tail v p n le
36a0: 6e 20 73 6b 20 66 6b 29 0a 20 20 20 20 20 20 20 n sk fk).
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
36c0: 20 20 20 20 20 20 20 66 6b 20 69 29 0a 20 20 20 fk i).
36d0: 20 20 20 20 20 20 20 20 66 6b 29 29 0a 20 20 20 fk)).
36e0: 20 20 20 20 66 6b 29 29 29 29 0a 0a 28 64 65 66 fk))))..(def
36f0: 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 74 63 68 ine-syntax match
3700: 2d 76 65 63 74 6f 72 2d 74 61 69 6c 0a 20 20 28 -vector-tail. (
3710: 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a syntax-rules ().
3720: 20 20 20 20 28 28 5f 20 76 20 70 20 6e 20 6c 65 ((_ v p n le
3730: 6e 20 73 6b 20 66 6b 20 69 29 0a 20 20 20 20 20 n sk fk i).
3740: 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 (match-extract-v
3750: 61 72 73 20 70 20 28 6d 61 74 63 68 2d 76 65 63 ars p (match-vec
3760: 74 6f 72 2d 74 61 69 6c 2d 74 77 6f 20 76 20 70 tor-tail-two v p
3770: 20 6e 20 6c 65 6e 20 73 6b 20 66 6b 20 69 29 20 n len sk fk i)
3780: 69 20 28 29 29 29 29 29 0a 0a 28 64 65 66 69 6e i ()))))..(defin
3790: 65 2d 73 79 6e 74 61 78 20 6d 61 74 63 68 2d 76 e-syntax match-v
37a0: 65 63 74 6f 72 2d 74 61 69 6c 2d 74 77 6f 0a 20 ector-tail-two.
37b0: 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 (syntax-rules (
37c0: 29 0a 20 20 20 20 28 28 5f 20 76 20 70 20 6e 20 ). ((_ v p n
37d0: 6c 65 6e 20 28 73 6b 20 2e 2e 2e 29 20 66 6b 20 len (sk ...) fk
37e0: 69 20 28 28 69 64 20 69 64 2d 6c 73 29 20 2e 2e i ((id id-ls) ..
37f0: 2e 29 29 0a 20 20 20 20 20 28 6c 65 74 20 6c 6f .)). (let lo
3800: 6f 70 20 28 28 6a 20 6e 29 20 28 69 64 2d 6c 73 op ((j n) (id-ls
3810: 20 27 28 29 29 20 2e 2e 2e 29 0a 20 20 20 20 20 '()) ...).
3820: 20 20 28 69 66 20 28 3e 3d 20 6a 20 6c 65 6e 29 (if (>= j len)
3830: 0a 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28 . (let (
3840: 28 69 64 20 28 72 65 76 65 72 73 65 20 69 64 2d (id (reverse id-
3850: 6c 73 29 29 20 2e 2e 2e 29 20 28 73 6b 20 2e 2e ls)) ...) (sk ..
3860: 2e 20 69 29 29 0a 20 20 20 20 20 20 20 20 20 28 . i)). (
3870: 6c 65 74 20 28 28 77 20 28 76 65 63 74 6f 72 2d let ((w (vector-
3880: 72 65 66 20 76 20 6a 29 29 29 0a 20 20 20 20 20 ref v j))).
3890: 20 20 20 20 20 20 28 6d 61 74 63 68 2d 6f 6e 65 (match-one
38a0: 20 77 20 70 20 28 76 65 63 74 6f 72 2d 72 65 66 w p (vector-ref
38b0: 20 76 20 6a 29 20 28 76 65 74 6f 72 2d 73 65 74 v j) (vetor-set
38c0: 21 20 76 20 6a 29 0a 20 20 20 20 20 20 20 20 20 ! v j).
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6d 61 (ma
38e0: 74 63 68 2d 64 72 6f 70 2d 69 64 73 20 28 6c 6f tch-drop-ids (lo
38f0: 6f 70 20 28 2b 20 6a 20 31 29 20 28 63 6f 6e 73 op (+ j 1) (cons
3900: 20 69 64 20 69 64 2d 6c 73 29 20 2e 2e 2e 29 29 id id-ls) ...))
3910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
3920: 20 20 20 20 20 20 20 66 6b 20 69 29 29 29 29 29 fk i)))))
3930: 29 29 0a 0a 3b 3b 20 45 78 74 72 61 63 74 20 61 ))..;; Extract a
3940: 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 ll identifiers i
3950: 6e 20 61 20 70 61 74 74 65 72 6e 2e 20 20 41 20 n a pattern. A
3960: 6c 69 74 74 6c 65 20 6d 6f 72 65 20 63 6f 6d 70 little more comp
3970: 6c 69 63 61 74 65 64 0a 3b 3b 20 74 68 61 6e 20 licated.;; than
3980: 6a 75 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 just looking for
3990: 20 73 79 6d 62 6f 6c 73 2c 20 77 65 20 6e 65 65 symbols, we nee
39a0: 64 20 74 6f 20 69 67 6e 6f 72 65 20 73 70 65 63 d to ignore spec
39b0: 69 61 6c 20 6b 65 79 77 6f 72 64 73 0a 3b 3b 20 ial keywords.;;
39c0: 61 6e 64 20 6e 6f 74 20 70 61 74 74 65 72 6e 20 and not pattern
39d0: 66 6f 72 6d 73 20 28 73 75 63 68 20 61 73 20 74 forms (such as t
39e0: 68 65 20 70 72 65 64 69 63 61 74 65 20 65 78 70 he predicate exp
39f0: 72 65 73 73 69 6f 6e 20 69 6e 20 3f 0a 3b 3b 20 ression in ?.;;
3a00: 70 61 74 74 65 72 6e 73 29 2e 0a 3b 3b 0a 3b 3b patterns)..;;.;;
3a10: 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d (match-extract-
3a20: 76 61 72 73 20 70 61 74 74 65 72 6e 20 63 6f 6e vars pattern con
3a30: 74 69 6e 75 61 74 69 6f 6e 20 28 69 64 73 20 2e tinuation (ids .
3a40: 2e 2e 29 20 28 6e 65 77 2d 76 61 72 73 20 2e 2e ..) (new-vars ..
3a50: 2e 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e .))..(define-syn
3a60: 74 61 78 20 6d 61 74 63 68 2d 65 78 74 72 61 63 tax match-extrac
3a70: 74 2d 76 61 72 73 0a 20 20 28 73 79 6e 74 61 78 t-vars. (syntax
3a80: 2d 72 75 6c 65 73 20 28 5f 20 5f 5f 5f 20 3f 20 -rules (_ ___ ?
3a90: 24 20 3d 20 71 75 6f 74 65 20 71 75 61 73 69 71 $ = quote quasiq
3aa0: 75 6f 74 65 20 61 6e 64 20 6f 72 20 6e 6f 74 20 uote and or not
3ab0: 67 65 74 21 20 73 65 74 21 29 0a 20 20 20 20 28 get! set!). (
3ac0: 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 (match-extract-v
3ad0: 61 72 73 20 28 3f 20 70 72 65 64 20 2e 20 70 29 ars (? pred . p)
3ae0: 20 6b 20 69 20 76 29 0a 20 20 20 20 20 28 6d 61 k i v). (ma
3af0: 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 tch-extract-vars
3b00: 20 70 20 6b 20 69 20 76 29 29 0a 20 20 20 20 28 p k i v)). (
3b10: 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 (match-extract-v
3b20: 61 72 73 20 28 24 20 72 65 63 20 2e 20 70 29 20 ars ($ rec . p)
3b30: 6b 20 69 20 76 29 0a 20 20 20 20 20 28 6d 61 74 k i v). (mat
3b40: 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 20 ch-extract-vars
3b50: 70 20 6b 20 69 20 76 29 29 0a 20 20 20 20 28 28 p k i v)). ((
3b60: 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 match-extract-va
3b70: 72 73 20 28 3d 20 70 72 6f 63 20 70 29 20 6b 20 rs (= proc p) k
3b80: 69 20 76 29 0a 20 20 20 20 20 28 6d 61 74 63 68 i v). (match
3b90: 2d 65 78 74 72 61 63 74 2d 76 61 72 73 20 70 20 -extract-vars p
3ba0: 6b 20 69 20 76 29 29 0a 20 20 20 20 28 28 6d 61 k i v)). ((ma
3bb0: 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 tch-extract-vars
3bc0: 20 28 71 75 6f 74 65 20 78 29 20 28 6b 20 2e 2e (quote x) (k ..
3bd0: 2e 29 20 69 20 76 29 0a 20 20 20 20 20 28 6b 20 .) i v). (k
3be0: 2e 2e 2e 20 76 29 29 0a 20 20 20 20 28 28 6d 61 ... v)). ((ma
3bf0: 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 tch-extract-vars
3c00: 20 28 71 75 61 73 69 71 75 6f 74 65 20 78 29 20 (quasiquote x)
3c10: 6b 20 69 20 76 29 0a 20 20 20 20 20 28 6d 61 74 k i v). (mat
3c20: 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 73 69 ch-extract-quasi
3c30: 71 75 6f 74 65 2d 76 61 72 73 20 78 20 6b 20 69 quote-vars x k i
3c40: 20 76 20 28 23 74 29 29 29 0a 20 20 20 20 28 28 v (#t))). ((
3c50: 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 match-extract-va
3c60: 72 73 20 28 61 6e 64 20 2e 20 70 29 20 6b 20 69 rs (and . p) k i
3c70: 20 76 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d v). (match-
3c80: 65 78 74 72 61 63 74 2d 76 61 72 73 20 70 20 6b extract-vars p k
3c90: 20 69 20 76 29 29 0a 20 20 20 20 28 28 6d 61 74 i v)). ((mat
3ca0: 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 20 ch-extract-vars
3cb0: 28 6f 72 20 2e 20 70 29 20 6b 20 69 20 76 29 0a (or . p) k i v).
3cc0: 20 20 20 20 20 28 6d 61 74 63 68 2d 65 78 74 72 (match-extr
3cd0: 61 63 74 2d 76 61 72 73 20 70 20 6b 20 69 20 76 act-vars p k i v
3ce0: 29 29 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 65 )). ((match-e
3cf0: 78 74 72 61 63 74 2d 76 61 72 73 20 28 6e 6f 74 xtract-vars (not
3d00: 20 2e 20 70 29 20 6b 20 69 20 76 29 0a 20 20 20 . p) k i v).
3d10: 20 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 (match-extract
3d20: 2d 76 61 72 73 20 70 20 6b 20 69 20 76 29 29 0a -vars p k i v)).
3d30: 20 20 20 20 3b 3b 20 41 20 6e 6f 6e 2d 6b 65 79 ;; A non-key
3d40: 77 6f 72 64 20 70 61 69 72 2c 20 65 78 70 61 6e word pair, expan
3d50: 64 20 74 68 65 20 43 41 52 20 77 69 74 68 20 61 d the CAR with a
3d60: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 74 6f continuation to
3d70: 0a 20 20 20 20 3b 3b 20 65 78 70 61 6e 64 20 74 . ;; expand t
3d80: 68 65 20 43 44 52 2e 0a 20 20 20 20 28 28 6d 61 he CDR.. ((ma
3d90: 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 tch-extract-vars
3da0: 20 28 70 20 71 20 2e 20 72 29 20 6b 20 69 20 76 (p q . r) k i v
3db0: 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 63 68 ). (match-ch
3dc0: 65 63 6b 2d 65 6c 6c 69 70 73 65 0a 20 20 20 20 eck-ellipse.
3dd0: 20 20 71 0a 20 20 20 20 20 20 28 6d 61 74 63 68 q. (match
3de0: 2d 65 78 74 72 61 63 74 2d 76 61 72 73 20 28 70 -extract-vars (p
3df0: 20 2e 20 72 29 20 6b 20 69 20 76 29 0a 20 20 20 . r) k i v).
3e00: 20 20 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 (match-extrac
3e10: 74 2d 76 61 72 73 20 70 20 28 6d 61 74 63 68 2d t-vars p (match-
3e20: 65 78 74 72 61 63 74 2d 76 61 72 73 2d 73 74 65 extract-vars-ste
3e30: 70 20 28 71 20 2e 20 72 29 20 6b 20 69 20 76 29 p (q . r) k i v)
3e40: 20 69 20 28 29 29 29 29 0a 20 20 20 20 28 28 6d i ()))). ((m
3e50: 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 atch-extract-var
3e60: 73 20 28 70 20 2e 20 71 29 20 6b 20 69 20 76 29 s (p . q) k i v)
3e70: 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 65 78 74 . (match-ext
3e80: 72 61 63 74 2d 76 61 72 73 20 70 20 28 6d 61 74 ract-vars p (mat
3e90: 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 2d ch-extract-vars-
3ea0: 73 74 65 70 20 71 20 6b 20 69 20 76 29 20 69 20 step q k i v) i
3eb0: 28 29 29 29 0a 20 20 20 20 28 28 6d 61 74 63 68 ())). ((match
3ec0: 2d 65 78 74 72 61 63 74 2d 76 61 72 73 20 23 28 -extract-vars #(
3ed0: 70 20 2e 2e 2e 29 20 6b 20 69 20 76 29 0a 20 20 p ...) k i v).
3ee0: 20 20 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 (match-extrac
3ef0: 74 2d 76 61 72 73 20 28 70 20 2e 2e 2e 29 20 6b t-vars (p ...) k
3f00: 20 69 20 76 29 29 0a 20 20 20 20 28 28 6d 61 74 i v)). ((mat
3f10: 63 68 2d 65 78 74 72 61 63 74 2d 76 61 72 73 20 ch-extract-vars
3f20: 5f 20 28 6b 20 2e 2e 2e 29 20 69 20 76 29 20 20 _ (k ...) i v)
3f30: 20 20 28 6b 20 2e 2e 2e 20 76 29 29 0a 20 20 20 (k ... v)).
3f40: 20 28 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 ((match-extract
3f50: 2d 76 61 72 73 20 5f 5f 5f 20 28 6b 20 2e 2e 2e -vars ___ (k ...
3f60: 29 20 69 20 76 29 20 20 28 6b 20 2e 2e 2e 20 76 ) i v) (k ... v
3f70: 29 29 0a 20 20 20 20 3b 3b 20 54 68 69 73 20 69 )). ;; This i
3f80: 73 20 74 68 65 20 6d 61 69 6e 20 70 61 72 74 2c s the main part,
3f90: 20 74 68 65 20 6f 6e 6c 79 20 70 6c 61 63 65 20 the only place
3fa0: 77 68 65 72 65 20 77 65 20 6d 69 67 68 74 20 61 where we might a
3fb0: 64 64 20 61 20 6e 65 77 0a 20 20 20 20 3b 3b 20 dd a new. ;;
3fc0: 76 61 72 20 69 66 20 69 74 27 73 20 61 6e 20 75 var if it's an u
3fd0: 6e 62 6f 75 6e 64 20 73 79 6d 62 6f 6c 2e 0a 20 nbound symbol..
3fe0: 20 20 20 28 28 6d 61 74 63 68 2d 65 78 74 72 61 ((match-extra
3ff0: 63 74 2d 76 61 72 73 20 70 20 28 6b 20 2e 2e 2e ct-vars p (k ...
4000: 29 20 28 69 20 2e 2e 2e 29 20 76 29 0a 20 20 20 ) (i ...) v).
4010: 20 20 28 6c 65 74 2d 73 79 6e 74 61 78 0a 20 20 (let-syntax.
4020: 20 20 20 20 20 20 20 28 28 6e 65 77 2d 73 79 6d ((new-sym
4030: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 28 73 79 ?. (sy
4040: 6e 74 61 78 2d 72 75 6c 65 73 20 28 69 20 2e 2e ntax-rules (i ..
4050: 2e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 .).
4060: 28 28 6e 65 77 2d 73 79 6d 3f 20 70 20 73 6b 20 ((new-sym? p sk
4070: 66 6b 29 20 73 6b 29 0a 20 20 20 20 20 20 20 20 fk) sk).
4080: 20 20 20 20 20 28 28 6e 65 77 2d 73 79 6d 3f 20 ((new-sym?
4090: 78 20 73 6b 20 66 6b 29 20 66 6b 29 29 29 29 0a x sk fk) fk)))).
40a0: 20 20 20 20 20 20 20 28 6e 65 77 2d 73 79 6d 3f (new-sym?
40b0: 20 72 61 6e 64 6f 6d 2d 73 79 6d 2d 74 6f 2d 6d random-sym-to-m
40c0: 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20 20 atch.
40d0: 20 20 20 20 20 20 28 6b 20 2e 2e 2e 20 28 28 70 (k ... ((p
40e0: 20 70 2d 6c 73 29 20 2e 20 76 29 29 0a 20 20 20 p-ls) . v)).
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6b (k
4100: 20 2e 2e 2e 20 76 29 29 29 29 0a 20 20 20 20 29 ... v)))). )
4110: 29 0a 0a 3b 3b 20 53 74 65 70 70 65 72 20 75 73 )..;; Stepper us
4120: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 ed in the above
4130: 73 6f 20 69 74 20 63 61 6e 20 65 78 70 61 6e 64 so it can expand
4140: 20 74 68 65 20 43 41 52 20 61 6e 64 20 43 44 52 the CAR and CDR
4150: 0a 3b 3b 20 73 65 70 61 72 61 74 65 6c 79 2e 0a .;; separately..
4160: 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 .(define-syntax
4170: 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 76 61 match-extract-va
4180: 72 73 2d 73 74 65 70 0a 20 20 28 73 79 6e 74 61 rs-step. (synta
4190: 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 x-rules (). (
41a0: 28 5f 20 70 20 6b 20 69 20 76 20 28 28 76 32 20 (_ p k i v ((v2
41b0: 76 32 2d 6c 73 29 20 2e 2e 2e 29 29 0a 20 20 20 v2-ls) ...)).
41c0: 20 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 (match-extract
41d0: 2d 76 61 72 73 20 70 20 6b 20 28 76 32 20 2e 2e -vars p k (v2 ..
41e0: 2e 20 2e 20 69 29 20 28 28 76 32 20 76 32 2d 6c . . i) ((v2 v2-l
41f0: 73 29 20 2e 2e 2e 20 2e 20 76 29 29 29 0a 20 20 s) ... . v))).
4200: 20 20 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 ))..(define-sy
4210: 6e 74 61 78 20 6d 61 74 63 68 2d 65 78 74 72 61 ntax match-extra
4220: 63 74 2d 71 75 61 73 69 71 75 6f 74 65 2d 76 61 ct-quasiquote-va
4230: 72 73 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c rs. (syntax-rul
4240: 65 73 20 28 71 75 61 73 69 71 75 6f 74 65 20 75 es (quasiquote u
4250: 6e 71 75 6f 74 65 20 75 6e 71 75 6f 74 65 2d 73 nquote unquote-s
4260: 70 6c 69 63 69 6e 67 29 0a 20 20 20 20 28 28 6d plicing). ((m
4270: 61 74 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 atch-extract-qua
4280: 73 69 71 75 6f 74 65 2d 76 61 72 73 20 28 71 75 siquote-vars (qu
4290: 61 73 69 71 75 6f 74 65 20 78 29 20 6b 20 69 20 asiquote x) k i
42a0: 76 20 64 29 0a 20 20 20 20 20 28 6d 61 74 63 68 v d). (match
42b0: 2d 65 78 74 72 61 63 74 2d 71 75 61 73 69 71 75 -extract-quasiqu
42c0: 6f 74 65 2d 76 61 72 73 20 78 20 6b 20 69 20 76 ote-vars x k i v
42d0: 20 28 23 74 20 2e 20 64 29 29 29 0a 20 20 20 20 (#t . d))).
42e0: 28 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d ((match-extract-
42f0: 71 75 61 73 69 71 75 6f 74 65 2d 76 61 72 73 20 quasiquote-vars
4300: 28 75 6e 71 75 6f 74 65 2d 73 70 6c 69 63 69 6e (unquote-splicin
4310: 67 20 78 29 20 6b 20 69 20 76 20 64 29 0a 20 20 g x) k i v d).
4320: 20 20 20 28 6d 61 74 63 68 2d 65 78 74 72 61 63 (match-extrac
4330: 74 2d 71 75 61 73 69 71 75 6f 74 65 2d 76 61 72 t-quasiquote-var
4340: 73 20 28 75 6e 71 75 6f 74 65 20 78 29 20 6b 20 s (unquote x) k
4350: 69 20 76 20 64 29 29 0a 20 20 20 20 28 28 6d 61 i v d)). ((ma
4360: 74 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 73 tch-extract-quas
4370: 69 71 75 6f 74 65 2d 76 61 72 73 20 28 75 6e 71 iquote-vars (unq
4380: 75 6f 74 65 20 78 29 20 6b 20 69 20 76 20 28 23 uote x) k i v (#
4390: 74 29 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d t)). (match-
43a0: 65 78 74 72 61 63 74 2d 76 61 72 73 20 78 20 6b extract-vars x k
43b0: 20 69 20 76 29 29 0a 20 20 20 20 28 28 6d 61 74 i v)). ((mat
43c0: 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 73 69 ch-extract-quasi
43d0: 71 75 6f 74 65 2d 76 61 72 73 20 28 75 6e 71 75 quote-vars (unqu
43e0: 6f 74 65 20 78 29 20 6b 20 69 20 76 20 28 23 74 ote x) k i v (#t
43f0: 20 2e 20 64 29 29 0a 20 20 20 20 20 28 6d 61 74 . d)). (mat
4400: 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 73 69 ch-extract-quasi
4410: 71 75 6f 74 65 2d 76 61 72 73 20 78 20 6b 20 69 quote-vars x k i
4420: 20 76 20 64 29 29 0a 20 20 20 20 28 28 6d 61 74 v d)). ((mat
4430: 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 73 69 ch-extract-quasi
4440: 71 75 6f 74 65 2d 76 61 72 73 20 28 78 20 2e 20 quote-vars (x .
4450: 79 29 20 6b 20 69 20 76 20 28 23 74 20 2e 20 64 y) k i v (#t . d
4460: 29 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d 65 )). (match-e
4470: 78 74 72 61 63 74 2d 71 75 61 73 69 71 75 6f 74 xtract-quasiquot
4480: 65 2d 76 61 72 73 0a 20 20 20 20 20 20 78 0a 20 e-vars. x.
4490: 20 20 20 20 20 28 6d 61 74 63 68 2d 65 78 74 72 (match-extr
44a0: 61 63 74 2d 71 75 61 73 69 71 75 6f 74 65 2d 76 act-quasiquote-v
44b0: 61 72 73 2d 73 74 65 70 20 79 20 6b 20 69 20 76 ars-step y k i v
44c0: 20 64 29 20 69 20 28 29 29 29 0a 20 20 20 20 28 d) i ())). (
44d0: 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 71 (match-extract-q
44e0: 75 61 73 69 71 75 6f 74 65 2d 76 61 72 73 20 23 uasiquote-vars #
44f0: 28 78 20 2e 2e 2e 29 20 6b 20 69 20 76 20 28 23 (x ...) k i v (#
4500: 74 20 2e 20 64 29 29 0a 20 20 20 20 20 28 6d 61 t . d)). (ma
4510: 74 63 68 2d 65 78 74 72 61 63 74 2d 71 75 61 73 tch-extract-quas
4520: 69 71 75 6f 74 65 2d 76 61 72 73 20 28 78 20 2e iquote-vars (x .
4530: 2e 2e 29 20 6b 20 69 20 76 20 64 29 29 0a 20 20 ..) k i v d)).
4540: 20 20 28 28 6d 61 74 63 68 2d 65 78 74 72 61 63 ((match-extrac
4550: 74 2d 71 75 61 73 69 71 75 6f 74 65 2d 76 61 72 t-quasiquote-var
4560: 73 20 78 20 28 6b 20 2e 2e 2e 29 20 69 20 76 20 s x (k ...) i v
4570: 28 23 74 20 2e 20 64 29 29 0a 20 20 20 20 20 28 (#t . d)). (
4580: 6b 20 2e 2e 2e 20 76 29 29 0a 20 20 20 20 29 29 k ... v)). ))
4590: 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 ..(define-syntax
45a0: 20 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 71 match-extract-q
45b0: 75 61 73 69 71 75 6f 74 65 2d 76 61 72 73 2d 73 uasiquote-vars-s
45c0: 74 65 70 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 tep. (syntax-ru
45d0: 6c 65 73 20 28 29 0a 20 20 20 20 28 28 5f 20 78 les (). ((_ x
45e0: 20 6b 20 69 20 76 20 64 20 28 28 76 32 20 76 32 k i v d ((v2 v2
45f0: 2d 6c 73 29 20 2e 2e 2e 29 29 0a 20 20 20 20 20 -ls) ...)).
4600: 28 6d 61 74 63 68 2d 65 78 74 72 61 63 74 2d 71 (match-extract-q
4610: 75 61 73 69 71 75 6f 74 65 2d 76 61 72 73 20 78 uasiquote-vars x
4620: 20 6b 20 28 76 32 20 2e 2e 2e 20 2e 20 69 29 20 k (v2 ... . i)
4630: 28 28 76 32 20 76 32 2d 6c 73 29 20 2e 2e 2e 20 ((v2 v2-ls) ...
4640: 2e 20 76 29 20 64 29 29 0a 20 20 20 20 29 29 0a . v) d)). )).
4650: 0a 0a 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ..;;;;;;;;;;;;;;
4660: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4670: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4680: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4690: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 0a 3b 3b 20 47 69 ;;;;;;;;;;.;; Gi
46a0: 6d 6d 65 20 73 6f 6d 65 20 73 75 67 61 72 20 62 mme some sugar b
46b0: 61 62 79 2e 0a 0a 28 64 65 66 69 6e 65 2d 73 79 aby...(define-sy
46c0: 6e 74 61 78 20 6d 61 74 63 68 2d 6c 61 6d 62 64 ntax match-lambd
46d0: 61 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 a. (syntax-rule
46e0: 73 20 28 29 0a 20 20 20 20 28 28 5f 20 63 6c 61 s (). ((_ cla
46f0: 75 73 65 20 2e 2e 2e 29 20 28 6c 61 6d 62 64 61 use ...) (lambda
4700: 20 28 65 78 70 72 29 20 28 6d 61 74 63 68 20 65 (expr) (match e
4710: 78 70 72 20 63 6c 61 75 73 65 20 2e 2e 2e 29 29 xpr clause ...))
4720: 29 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e )))..(define-syn
4730: 74 61 78 20 6d 61 74 63 68 2d 6c 61 6d 62 64 61 tax match-lambda
4740: 2a 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 *. (syntax-rule
4750: 73 20 28 29 0a 20 20 20 20 28 28 5f 20 63 6c 61 s (). ((_ cla
4760: 75 73 65 20 2e 2e 2e 29 20 28 6c 61 6d 62 64 61 use ...) (lambda
4770: 20 65 78 70 72 20 28 6d 61 74 63 68 20 65 78 70 expr (match exp
4780: 72 20 63 6c 61 75 73 65 20 2e 2e 2e 29 29 29 29 r clause ...))))
4790: 29 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 )..(define-synta
47a0: 78 20 6d 61 74 63 68 2d 6c 65 74 0a 20 20 28 73 x match-let. (s
47b0: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 yntax-rules ().
47c0: 20 20 20 28 28 5f 20 28 76 61 72 73 20 2e 2e 2e ((_ (vars ...
47d0: 29 20 2e 20 62 6f 64 79 29 0a 20 20 20 20 20 28 ) . body). (
47e0: 6d 61 74 63 68 2d 6c 65 74 2f 68 65 6c 70 65 72 match-let/helper
47f0: 20 6c 65 74 20 28 29 20 28 29 20 28 76 61 72 73 let () () (vars
4800: 20 2e 2e 2e 29 20 2e 20 62 6f 64 79 29 29 0a 20 ...) . body)).
4810: 20 20 20 28 28 5f 20 6c 6f 6f 70 20 2e 20 72 65 ((_ loop . re
4820: 73 74 29 0a 20 20 20 20 20 28 6d 61 74 63 68 2d st). (match-
4830: 6e 61 6d 65 64 2d 6c 65 74 20 6c 6f 6f 70 20 28 named-let loop (
4840: 29 20 2e 20 72 65 73 74 29 29 29 29 0a 0a 28 64 ) . rest))))..(d
4850: 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 74 efine-syntax mat
4860: 63 68 2d 6c 65 74 72 65 63 0a 20 20 28 73 79 6e ch-letrec. (syn
4870: 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 tax-rules ().
4880: 20 28 28 5f 20 76 61 72 73 20 2e 20 62 6f 64 79 ((_ vars . body
4890: 29 20 28 6d 61 74 63 68 2d 6c 65 74 2f 68 65 6c ) (match-let/hel
48a0: 70 65 72 20 6c 65 74 72 65 63 20 28 29 20 28 29 per letrec () ()
48b0: 20 76 61 72 73 20 2e 20 62 6f 64 79 29 29 29 29 vars . body))))
48c0: 0a 0a 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 ..(define-syntax
48d0: 20 6d 61 74 63 68 2d 6c 65 74 2f 68 65 6c 70 65 match-let/helpe
48e0: 72 0a 20 20 28 73 79 6e 74 61 78 2d 72 75 6c 65 r. (syntax-rule
48f0: 73 20 28 29 0a 20 20 20 20 28 28 5f 20 6c 65 74 s (). ((_ let
4900: 20 28 28 76 61 72 20 65 78 70 72 29 20 2e 2e 2e ((var expr) ...
4910: 29 20 28 29 20 28 29 20 2e 20 62 6f 64 79 29 0a ) () () . body).
4920: 20 20 20 20 20 28 6c 65 74 20 28 28 76 61 72 20 (let ((var
4930: 65 78 70 72 29 20 2e 2e 2e 29 20 2e 20 62 6f 64 expr) ...) . bod
4940: 79 29 29 0a 20 20 20 20 28 28 5f 20 6c 65 74 20 y)). ((_ let
4950: 28 28 76 61 72 20 65 78 70 72 29 20 2e 2e 2e 29 ((var expr) ...)
4960: 20 28 28 70 61 74 20 74 6d 70 29 20 2e 2e 2e 29 ((pat tmp) ...)
4970: 20 28 29 20 2e 20 62 6f 64 79 29 0a 20 20 20 20 () . body).
4980: 20 28 6c 65 74 20 28 28 76 61 72 20 65 78 70 72 (let ((var expr
4990: 29 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 28 6d ) ...). (m
49a0: 61 74 63 68 2d 6c 65 74 2a 20 28 28 70 61 74 20 atch-let* ((pat
49b0: 74 6d 70 29 20 2e 2e 2e 29 0a 20 20 20 20 20 20 tmp) ...).
49c0: 20 20 20 2e 20 62 6f 64 79 29 29 29 0a 20 20 20 . body))).
49d0: 20 28 28 5f 20 6c 65 74 20 28 76 20 2e 2e 2e 29 ((_ let (v ...)
49e0: 20 28 70 20 2e 2e 2e 29 20 28 28 28 61 20 2e 20 (p ...) (((a .
49f0: 62 29 20 65 78 70 72 29 20 2e 20 72 65 73 74 29 b) expr) . rest)
4a00: 20 2e 20 62 6f 64 79 29 0a 20 20 20 20 20 28 6d . body). (m
4a10: 61 74 63 68 2d 6c 65 74 2f 68 65 6c 70 65 72 0a atch-let/helper.
4a20: 20 20 20 20 20 20 6c 65 74 20 28 76 20 2e 2e 2e let (v ...
4a30: 20 28 74 6d 70 20 65 78 70 72 29 29 20 28 70 20 (tmp expr)) (p
4a40: 2e 2e 2e 20 28 28 61 20 2e 20 62 29 20 74 6d 70 ... ((a . b) tmp
4a50: 29 29 20 72 65 73 74 20 2e 20 62 6f 64 79 29 29 )) rest . body))
4a60: 0a 20 20 20 20 28 28 5f 20 6c 65 74 20 28 76 20 . ((_ let (v
4a70: 2e 2e 2e 29 20 28 70 20 2e 2e 2e 29 20 28 28 23 ...) (p ...) ((#
4a80: 28 61 20 2e 2e 2e 29 20 65 78 70 72 29 20 2e 20 (a ...) expr) .
4a90: 72 65 73 74 29 20 2e 20 62 6f 64 79 29 0a 20 20 rest) . body).
4aa0: 20 20 20 28 6d 61 74 63 68 2d 6c 65 74 2f 68 65 (match-let/he
4ab0: 6c 70 65 72 0a 20 20 20 20 20 20 6c 65 74 20 28 lper. let (
4ac0: 76 20 2e 2e 2e 20 28 74 6d 70 20 65 78 70 72 29 v ... (tmp expr)
4ad0: 29 20 28 70 20 2e 2e 2e 20 28 23 28 61 20 2e 2e ) (p ... (#(a ..
4ae0: 2e 29 20 74 6d 70 29 29 20 72 65 73 74 20 2e 20 .) tmp)) rest .
4af0: 62 6f 64 79 29 29 0a 20 20 20 20 28 28 5f 20 6c body)). ((_ l
4b00: 65 74 20 28 76 20 2e 2e 2e 29 20 28 70 20 2e 2e et (v ...) (p ..
4b10: 2e 29 20 28 28 61 20 65 78 70 72 29 20 2e 20 72 .) ((a expr) . r
4b20: 65 73 74 29 20 2e 20 62 6f 64 79 29 0a 20 20 20 est) . body).
4b30: 20 20 28 6d 61 74 63 68 2d 6c 65 74 2f 68 65 6c (match-let/hel
4b40: 70 65 72 20 6c 65 74 20 28 76 20 2e 2e 2e 20 28 per let (v ... (
4b50: 61 20 65 78 70 72 29 29 20 28 70 20 2e 2e 2e 29 a expr)) (p ...)
4b60: 20 72 65 73 74 20 2e 20 62 6f 64 79 29 29 0a 20 rest . body)).
4b70: 20 20 20 29 29 0a 0a 28 64 65 66 69 6e 65 2d 73 ))..(define-s
4b80: 79 6e 74 61 78 20 6d 61 74 63 68 2d 6e 61 6d 65 yntax match-name
4b90: 64 2d 6c 65 74 0a 20 20 28 73 79 6e 74 61 78 2d d-let. (syntax-
4ba0: 72 75 6c 65 73 20 28 29 0a 20 20 20 20 28 28 5f rules (). ((_
4bb0: 20 6c 6f 6f 70 20 28 28 70 61 74 20 65 78 70 72 loop ((pat expr
4bc0: 20 76 61 72 29 20 2e 2e 2e 29 20 28 29 20 2e 20 var) ...) () .
4bd0: 62 6f 64 79 29 0a 20 20 20 20 20 28 6c 65 74 20 body). (let
4be0: 6c 6f 6f 70 20 28 28 76 61 72 20 65 78 70 72 29 loop ((var expr)
4bf0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 28 6d 61 ...). (ma
4c00: 74 63 68 2d 6c 65 74 20 28 28 70 61 74 20 76 61 tch-let ((pat va
4c10: 72 29 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 r) ...).
4c20: 20 2e 20 62 6f 64 79 29 29 29 0a 20 20 20 20 28 . body))). (
4c30: 28 5f 20 6c 6f 6f 70 20 28 76 20 2e 2e 2e 29 20 (_ loop (v ...)
4c40: 28 28 70 61 74 20 65 78 70 72 29 20 2e 20 72 65 ((pat expr) . re
4c50: 73 74 29 20 2e 20 62 6f 64 79 29 0a 20 20 20 20 st) . body).
4c60: 20 28 6d 61 74 63 68 2d 6e 61 6d 65 64 2d 6c 65 (match-named-le
4c70: 74 20 6c 6f 6f 70 20 28 76 20 2e 2e 2e 20 28 70 t loop (v ... (p
4c80: 61 74 20 65 78 70 72 20 74 6d 70 29 29 20 72 65 at expr tmp)) re
4c90: 73 74 20 2e 20 62 6f 64 79 29 29 29 29 0a 0a 28 st . body))))..(
4ca0: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 define-syntax ma
4cb0: 74 63 68 2d 6c 65 74 2a 0a 20 20 28 73 79 6e 74 tch-let*. (synt
4cc0: 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 ax-rules ().
4cd0: 28 28 5f 20 28 29 20 2e 20 62 6f 64 79 29 0a 20 ((_ () . body).
4ce0: 20 20 20 20 28 62 65 67 69 6e 20 2e 20 62 6f 64 (begin . bod
4cf0: 79 29 29 0a 20 20 20 20 28 28 5f 20 28 28 70 61 y)). ((_ ((pa
4d00: 74 20 65 78 70 72 29 20 2e 20 72 65 73 74 29 20 t expr) . rest)
4d10: 2e 20 62 6f 64 79 29 0a 20 20 20 20 20 28 6d 61 . body). (ma
4d20: 74 63 68 20 65 78 70 72 20 28 70 61 74 20 28 6d tch expr (pat (m
4d30: 61 74 63 68 2d 6c 65 74 2a 20 72 65 73 74 20 2e atch-let* rest .
4d40: 20 62 6f 64 79 29 29 29 29 29 29 0a 0a 0a 3b 3b body))))))...;;
4d50: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4d60: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4d70: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4d80: 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b 3b ;;;;;;;;;;;;;;;;
4d90: 3b 3b 3b 3b 3b 3b 0a 3b 3b 20 4f 74 68 65 72 77 ;;;;;;.;; Otherw
4da0: 69 73 65 20 43 4f 4e 44 2d 45 58 50 41 4e 44 65 ise COND-EXPANDe
4db0: 64 20 62 69 74 73 2e 0a 0a 3b 3b 20 54 68 69 73 d bits...;; This
4dc0: 20 2a 73 68 6f 75 6c 64 2a 20 77 6f 72 6b 2c 20 *should* work,
4dd0: 62 75 74 20 64 6f 65 73 6e 27 74 20 3a 28 0a 3b but doesn't :(.;
4de0: 3b 20 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 ; (define-synt
4df0: 61 78 20 6d 61 74 63 68 2d 63 68 65 63 6b 2d 65 ax match-check-e
4e00: 6c 6c 69 70 73 65 0a 3b 3b 20 20 20 20 20 28 73 llipse.;; (s
4e10: 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 2e 2e 2e yntax-rules (...
4e20: 29 0a 3b 3b 20 20 20 20 20 20 20 28 28 5f 20 2e ).;; ((_ .
4e30: 2e 2e 20 73 6b 20 66 6b 29 20 73 6b 29 0a 3b 3b .. sk fk) sk).;;
4e40: 20 20 20 20 20 20 20 28 28 5f 20 78 20 73 6b 20 ((_ x sk
4e50: 66 6b 29 20 66 6b 29 29 29 0a 0a 3b 3b 20 54 68 fk) fk)))..;; Th
4e60: 69 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6d is is a little m
4e70: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c ore complicated,
4e80: 20 61 6e 64 20 69 6e 74 72 6f 64 75 63 65 73 20 and introduces
4e90: 61 20 6e 65 77 20 6c 65 74 2d 73 79 6e 74 61 78 a new let-syntax
4ea0: 2c 0a 3b 3b 20 62 75 74 20 73 68 6f 75 6c 64 20 ,.;; but should
4eb0: 77 6f 72 6b 20 70 6f 72 74 61 62 6c 79 20 69 6e work portably in
4ec0: 20 61 6e 79 20 52 5b 35 36 5d 52 53 20 53 63 68 any R[56]RS Sch
4ed0: 65 6d 65 2e 20 20 54 61 79 6c 6f 72 20 43 61 6d eme. Taylor Cam
4ee0: 70 62 65 6c 6c 0a 3b 3b 20 6f 72 69 67 69 6e 61 pbell.;; origina
4ef0: 6c 6c 79 20 63 61 6d 65 20 75 70 20 77 69 74 68 lly came up with
4f00: 20 74 68 65 20 69 64 65 61 2e 0a 28 64 65 66 69 the idea..(defi
4f10: 6e 65 2d 73 79 6e 74 61 78 20 6d 61 74 63 68 2d ne-syntax match-
4f20: 63 68 65 63 6b 2d 65 6c 6c 69 70 73 65 0a 20 20 check-ellipse.
4f30: 28 73 79 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 (syntax-rules ()
4f40: 0a 20 20 20 20 3b 3b 20 74 68 65 73 65 20 74 77 . ;; these tw
4f50: 6f 20 61 72 65 6e 27 74 20 6e 65 63 65 73 73 61 o aren't necessa
4f60: 72 79 20 62 75 74 20 70 72 6f 76 69 64 65 20 66 ry but provide f
4f70: 61 73 74 2d 63 61 73 65 20 66 61 69 6c 75 72 65 ast-case failure
4f80: 73 0a 20 20 20 20 28 28 6d 61 74 63 68 2d 63 68 s. ((match-ch
4f90: 65 63 6b 2d 65 6c 6c 69 70 73 65 20 28 61 20 2e eck-ellipse (a .
4fa0: 20 62 29 20 73 75 63 63 65 73 73 2d 6b 20 66 61 b) success-k fa
4fb0: 69 6c 75 72 65 2d 6b 29 20 66 61 69 6c 75 72 65 ilure-k) failure
4fc0: 2d 6b 29 0a 20 20 20 20 28 28 6d 61 74 63 68 2d -k). ((match-
4fd0: 63 68 65 63 6b 2d 65 6c 6c 69 70 73 65 20 23 28 check-ellipse #(
4fe0: 61 20 2e 2e 2e 29 20 73 75 63 63 65 73 73 2d 6b a ...) success-k
4ff0: 20 66 61 69 6c 75 72 65 2d 6b 29 20 66 61 69 6c failure-k) fail
5000: 75 72 65 2d 6b 29 0a 20 20 20 20 3b 3b 20 6d 61 ure-k). ;; ma
5010: 74 63 68 69 6e 67 20 61 6e 20 61 74 6f 6d 0a 20 tching an atom.
5020: 20 20 20 28 28 6d 61 74 63 68 2d 63 68 65 63 6b ((match-check
5030: 2d 65 6c 6c 69 70 73 65 20 69 64 20 73 75 63 63 -ellipse id succ
5040: 65 73 73 2d 6b 20 66 61 69 6c 75 72 65 2d 6b 29 ess-k failure-k)
5050: 0a 20 20 20 20 20 28 6c 65 74 2d 73 79 6e 74 61 . (let-synta
5060: 78 20 28 28 65 6c 6c 69 70 73 65 3f 20 28 73 79 x ((ellipse? (sy
5070: 6e 74 61 78 2d 72 75 6c 65 73 20 28 29 0a 20 20 ntax-rules ().
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5090: 20 20 20 20 20 20 20 20 20 20 20 20 3b 3b 20 69 ;; i
50a0: 66 66 20 60 69 64 27 20 69 73 20 60 2e 2e 2e 27 ff `id' is `...'
50b0: 20 68 65 72 65 20 74 68 65 6e 20 74 68 69 73 20 here then this
50c0: 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 will.
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
50e0: 20 20 20 3b 3b 20 6d 61 74 63 68 20 61 20 6c 69 ;; match a li
50f0: 73 74 20 6f 66 20 61 6e 79 20 6c 65 6e 67 74 68 st of any length
5100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
5120: 28 65 6c 6c 69 70 73 65 3f 20 28 66 6f 6f 20 69 (ellipse? (foo i
5130: 64 29 20 73 6b 20 66 6b 29 20 73 6b 29 0a 20 20 d) sk fk) sk).
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5150: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65 6c ((el
5160: 6c 69 70 73 65 3f 20 6f 74 68 65 72 20 73 6b 20 lipse? other sk
5170: 66 6b 29 20 66 6b 29 29 29 29 0a 20 20 20 20 20 fk) fk)))).
5180: 20 20 3b 3b 20 74 68 69 73 20 6c 69 73 74 20 6f ;; this list o
5190: 66 20 74 68 72 65 65 20 65 6c 65 6d 65 6e 74 73 f three elements
51a0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 6d 61 6e 79 20 will only many
51b0: 74 68 65 20 28 66 6f 6f 20 69 64 29 20 6c 69 73 the (foo id) lis
51c0: 74 0a 20 20 20 20 20 20 20 3b 3b 20 61 62 6f 76 t. ;; abov
51d0: 65 20 69 66 20 60 69 64 27 20 69 73 20 60 2e 2e e if `id' is `..
51e0: 2e 27 0a 20 20 20 20 20 20 20 28 65 6c 6c 69 70 .'. (ellip
51f0: 73 65 3f 20 28 61 20 62 20 63 29 20 73 75 63 63 se? (a b c) succ
5200: 65 73 73 2d 6b 20 66 61 69 6c 75 72 65 2d 6b 29 ess-k failure-k)
5210: 29 29 29 29 0a 0a 0a 3b 3b 20 54 68 69 73 20 69 ))))...;; This i
5220: 73 20 70 6f 72 74 61 62 6c 65 20 62 75 74 20 63 s portable but c
5230: 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63 an be more effic
5240: 69 65 6e 74 20 77 69 74 68 20 6e 6f 6e 2d 70 6f ient with non-po
5250: 72 74 61 62 6c 65 0a 3b 3b 20 65 78 74 65 6e 73 rtable.;; extens
5260: 69 6f 6e 73 2e 20 20 54 68 69 73 20 74 72 69 63 ions. This tric
5270: 6b 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 k was originally
5280: 20 64 69 73 63 6f 76 65 72 65 64 20 62 79 20 4f discovered by O
5290: 6c 65 67 20 4b 69 73 65 6c 79 6f 76 2e 0a 0a 28 leg Kiselyov...(
52a0: 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 6d 61 define-syntax ma
52b0: 74 63 68 2d 63 68 65 63 6b 2d 69 64 65 6e 74 69 tch-check-identi
52c0: 66 69 65 72 0a 20 20 28 73 79 6e 74 61 78 2d 72 fier. (syntax-r
52d0: 75 6c 65 73 20 28 29 0a 20 20 20 20 3b 3b 20 66 ules (). ;; f
52e0: 61 73 74 2d 63 61 73 65 20 66 61 69 6c 75 72 65 ast-case failure
52f0: 73 2c 20 6c 69 73 74 73 20 61 6e 64 20 76 65 63 s, lists and vec
5300: 74 6f 72 73 20 61 72 65 20 6e 6f 74 20 69 64 65 tors are not ide
5310: 6e 74 69 66 69 65 72 73 0a 20 20 20 20 28 28 5f ntifiers. ((_
5320: 20 28 78 20 2e 20 79 29 20 73 75 63 63 65 73 73 (x . y) success
5330: 2d 6b 20 66 61 69 6c 75 72 65 2d 6b 29 20 66 61 -k failure-k) fa
5340: 69 6c 75 72 65 2d 6b 29 0a 20 20 20 20 28 28 5f ilure-k). ((_
5350: 20 23 28 78 20 2e 2e 2e 29 20 73 75 63 63 65 73 #(x ...) succes
5360: 73 2d 6b 20 66 61 69 6c 75 72 65 2d 6b 29 20 66 s-k failure-k) f
5370: 61 69 6c 75 72 65 2d 6b 29 0a 20 20 20 20 3b 3b ailure-k). ;;
5380: 20 78 20 69 73 20 61 6e 20 61 74 6f 6d 0a 20 20 x is an atom.
5390: 20 20 28 28 5f 20 78 20 73 75 63 63 65 73 73 2d ((_ x success-
53a0: 6b 20 66 61 69 6c 75 72 65 2d 6b 29 0a 20 20 20 k failure-k).
53b0: 20 20 28 6c 65 74 2d 73 79 6e 74 61 78 0a 20 20 (let-syntax.
53c0: 20 20 20 20 20 20 20 28 28 73 79 6d 3f 0a 20 20 ((sym?.
53d0: 20 20 20 20 20 20 20 20 20 28 73 79 6e 74 61 78 (syntax
53e0: 2d 72 75 6c 65 73 20 28 29 0a 20 20 20 20 20 20 -rules ().
53f0: 20 20 20 20 20 20 20 3b 3b 20 69 66 20 74 68 65 ;; if the
5400: 20 73 79 6d 62 6f 6c 20 60 61 62 72 61 63 61 64 symbol `abracad
5410: 61 62 72 61 27 20 6d 61 74 63 68 65 73 20 78 2c abra' matches x,
5420: 20 74 68 65 6e 20 78 20 69 73 20 61 0a 20 20 20 then x is a.
5430: 20 20 20 20 20 20 20 20 20 20 3b 3b 20 73 79 6d ;; sym
5440: 62 6f 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 bol.
5450: 20 28 28 73 79 6d 3f 20 78 20 73 6b 20 66 6b 29 ((sym? x sk fk)
5460: 20 73 6b 29 0a 20 20 20 20 20 20 20 20 20 20 20 sk).
5470: 20 20 3b 3b 20 6f 74 68 65 72 77 69 73 65 20 78 ;; otherwise x
5480: 20 69 73 20 61 20 6e 6f 6e 2d 73 79 6d 62 6f 6c is a non-symbol
5490: 20 64 61 74 75 6d 0a 20 20 20 20 20 20 20 20 20 datum.
54a0: 20 20 20 20 28 28 73 79 6d 3f 20 79 20 73 6b 20 ((sym? y sk
54b0: 66 6b 29 20 66 6b 29 29 29 29 0a 20 20 20 20 20 fk) fk)))).
54c0: 20 20 28 73 79 6d 3f 20 61 62 72 61 63 61 64 61 (sym? abracada
54d0: 62 72 61 20 73 75 63 63 65 73 73 2d 6b 20 66 61 bra success-k fa
54e0: 69 6c 75 72 65 2d 6b 29 29 29 0a 20 20 20 20 29 ilure-k))). )
54f0: 29 0a ).