Hex Artifact Content
Not logged in

Artifact 30e9cc398ea9da2a7a67ada484d3b58213f43d85:


0000: 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 28 63 29  ;; Copyright (c)
0010: 20 32 30 30 39 20 44 65 72 69 63 6b 20 45 64 64   2009 Derick Edd
0020: 69 6e 67 74 6f 6e 2e 20 20 41 6c 6c 20 72 69 67  ington.  All rig
0030: 68 74 73 20 72 65 73 65 72 76 65 64 2e 0a 3b 3b  hts reserved..;;
0040: 20 4c 69 63 65 6e 73 65 64 20 75 6e 64 65 72 20   Licensed under 
0050: 61 6e 20 4d 49 54 2d 73 74 79 6c 65 20 6c 69 63  an MIT-style lic
0060: 65 6e 73 65 2e 20 20 4d 79 20 6c 69 63 65 6e 73  ense.  My licens
0070: 65 20 69 73 20 69 6e 20 74 68 65 20 66 69 6c 65  e is in the file
0080: 0a 3b 3b 20 6e 61 6d 65 64 20 4c 49 43 45 4e 53  .;; named LICENS
0090: 45 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  E from the origi
00a0: 6e 61 6c 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 74  nal collection t
00b0: 68 69 73 20 66 69 6c 65 20 69 73 20 64 69 73 74  his file is dist
00c0: 72 69 62 75 74 65 64 0a 3b 3b 20 77 69 74 68 2e  ributed.;; with.
00d0: 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 69    If this file i
00e0: 73 20 72 65 64 69 73 74 72 69 62 75 74 65 64 20  s redistributed 
00f0: 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
0100: 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 6d 79 0a 3b  collection, my.;
0110: 3b 20 6c 69 63 65 6e 73 65 20 6d 75 73 74 20 61  ; license must a
0120: 6c 73 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 2e  lso be included.
0130: 0a 0a 23 21 72 36 72 73 0a 28 6c 69 62 72 61 72  ..#!r6rs.(librar
0140: 79 20 28 73 72 66 69 20 73 31 34 20 63 68 61 72  y (srfi s14 char
0150: 2d 73 65 74 73 29 0a 20 20 28 65 78 70 6f 72 74  -sets).  (export
0160: 0a 20 20 20 20 3b 20 50 72 65 64 69 63 61 74 65  .    ; Predicate
0170: 73 20 26 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  s & comparison. 
0180: 20 20 20 63 68 61 72 2d 73 65 74 3f 20 63 68 61     char-set? cha
0190: 72 2d 73 65 74 3d 20 63 68 61 72 2d 73 65 74 3c  r-set= char-set<
01a0: 3d 20 63 68 61 72 2d 73 65 74 2d 68 61 73 68 0a  = char-set-hash.
01b0: 20 20 20 20 3b 20 49 74 65 72 61 74 69 6e 67 20      ; Iterating 
01c0: 6f 76 65 72 20 63 68 61 72 61 63 74 65 72 20 73  over character s
01d0: 65 74 73 0a 20 20 20 20 63 68 61 72 2d 73 65 74  ets.    char-set
01e0: 2d 63 75 72 73 6f 72 20 63 68 61 72 2d 73 65 74  -cursor char-set
01f0: 2d 72 65 66 20 63 68 61 72 2d 73 65 74 2d 63 75  -ref char-set-cu
0200: 72 73 6f 72 2d 6e 65 78 74 20 65 6e 64 2d 6f 66  rsor-next end-of
0210: 2d 63 68 61 72 2d 73 65 74 3f 20 0a 20 20 20 20  -char-set? .    
0220: 63 68 61 72 2d 73 65 74 2d 66 6f 6c 64 20 63 68  char-set-fold ch
0230: 61 72 2d 73 65 74 2d 75 6e 66 6f 6c 64 20 63 68  ar-set-unfold ch
0240: 61 72 2d 73 65 74 2d 75 6e 66 6f 6c 64 21 0a 20  ar-set-unfold!. 
0250: 20 20 20 63 68 61 72 2d 73 65 74 2d 66 6f 72 2d     char-set-for-
0260: 65 61 63 68 20 63 68 61 72 2d 73 65 74 2d 6d 61  each char-set-ma
0270: 70 0a 20 20 20 20 3b 20 43 72 65 61 74 69 6e 67  p.    ; Creating
0280: 20 63 68 61 72 61 63 74 65 72 20 73 65 74 73 0a   character sets.
0290: 20 20 20 20 63 68 61 72 2d 73 65 74 2d 63 6f 70      char-set-cop
02a0: 79 20 63 68 61 72 2d 73 65 74 0a 20 20 20 20 6c  y char-set.    l
02b0: 69 73 74 2d 3e 63 68 61 72 2d 73 65 74 20 20 73  ist->char-set  s
02c0: 74 72 69 6e 67 2d 3e 63 68 61 72 2d 73 65 74 0a  tring->char-set.
02d0: 20 20 20 20 6c 69 73 74 2d 3e 63 68 61 72 2d 73      list->char-s
02e0: 65 74 21 20 73 74 72 69 6e 67 2d 3e 63 68 61 72  et! string->char
02f0: 2d 73 65 74 21 0a 20 20 20 20 63 68 61 72 2d 73  -set!.    char-s
0300: 65 74 2d 66 69 6c 74 65 72 20 20 75 63 73 2d 72  et-filter  ucs-r
0310: 61 6e 67 65 2d 3e 63 68 61 72 2d 73 65 74 20 0a  ange->char-set .
0320: 20 20 20 20 63 68 61 72 2d 73 65 74 2d 66 69 6c      char-set-fil
0330: 74 65 72 21 20 75 63 73 2d 72 61 6e 67 65 2d 3e  ter! ucs-range->
0340: 63 68 61 72 2d 73 65 74 21 0a 20 20 20 20 2d 3e  char-set!.    ->
0350: 63 68 61 72 2d 73 65 74 0a 20 20 20 20 3b 20 51  char-set.    ; Q
0360: 75 65 72 79 69 6e 67 20 63 68 61 72 61 63 74 65  uerying characte
0370: 72 20 73 65 74 73 0a 20 20 20 20 63 68 61 72 2d  r sets.    char-
0380: 73 65 74 2d 3e 6c 69 73 74 20 63 68 61 72 2d 73  set->list char-s
0390: 65 74 2d 3e 73 74 72 69 6e 67 0a 20 20 20 20 63  et->string.    c
03a0: 68 61 72 2d 73 65 74 2d 73 69 7a 65 20 63 68 61  har-set-size cha
03b0: 72 2d 73 65 74 2d 63 6f 75 6e 74 20 63 68 61 72  r-set-count char
03c0: 2d 73 65 74 2d 63 6f 6e 74 61 69 6e 73 3f 0a 20  -set-contains?. 
03d0: 20 20 20 63 68 61 72 2d 73 65 74 2d 65 76 65 72     char-set-ever
03e0: 79 20 63 68 61 72 2d 73 65 74 2d 61 6e 79 0a 20  y char-set-any. 
03f0: 20 20 20 3b 20 43 68 61 72 61 63 74 65 72 2d 73     ; Character-s
0400: 65 74 20 61 6c 67 65 62 72 61 0a 20 20 20 20 63  et algebra.    c
0410: 68 61 72 2d 73 65 74 2d 61 64 6a 6f 69 6e 20 20  har-set-adjoin  
0420: 63 68 61 72 2d 73 65 74 2d 64 65 6c 65 74 65 0a  char-set-delete.
0430: 20 20 20 20 63 68 61 72 2d 73 65 74 2d 61 64 6a      char-set-adj
0440: 6f 69 6e 21 20 63 68 61 72 2d 73 65 74 2d 64 65  oin! char-set-de
0450: 6c 65 74 65 21 0a 20 20 20 20 63 68 61 72 2d 73  lete!.    char-s
0460: 65 74 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 20 63  et-complement  c
0470: 68 61 72 2d 73 65 74 2d 75 6e 69 6f 6e 20 20 63  har-set-union  c
0480: 68 61 72 2d 73 65 74 2d 69 6e 74 65 72 73 65 63  har-set-intersec
0490: 74 69 6f 6e 0a 20 20 20 20 63 68 61 72 2d 73 65  tion.    char-se
04a0: 74 2d 63 6f 6d 70 6c 65 6d 65 6e 74 21 20 63 68  t-complement! ch
04b0: 61 72 2d 73 65 74 2d 75 6e 69 6f 6e 21 20 63 68  ar-set-union! ch
04c0: 61 72 2d 73 65 74 2d 69 6e 74 65 72 73 65 63 74  ar-set-intersect
04d0: 69 6f 6e 21 0a 20 20 20 20 63 68 61 72 2d 73 65  ion!.    char-se
04e0: 74 2d 64 69 66 66 65 72 65 6e 63 65 20 20 63 68  t-difference  ch
04f0: 61 72 2d 73 65 74 2d 78 6f 72 20 20 63 68 61 72  ar-set-xor  char
0500: 2d 73 65 74 2d 64 69 66 66 2b 69 6e 74 65 72 73  -set-diff+inters
0510: 65 63 74 69 6f 6e 0a 20 20 20 20 63 68 61 72 2d  ection.    char-
0520: 73 65 74 2d 64 69 66 66 65 72 65 6e 63 65 21 20  set-difference! 
0530: 63 68 61 72 2d 73 65 74 2d 78 6f 72 21 20 63 68  char-set-xor! ch
0540: 61 72 2d 73 65 74 2d 64 69 66 66 2b 69 6e 74 65  ar-set-diff+inte
0550: 72 73 65 63 74 69 6f 6e 21 0a 20 20 20 20 3b 20  rsection!.    ; 
0560: 53 74 61 6e 64 61 72 64 20 63 68 61 72 61 63 74  Standard charact
0570: 65 72 20 73 65 74 73 0a 20 20 20 20 63 68 61 72  er sets.    char
0580: 2d 73 65 74 3a 6c 6f 77 65 72 2d 63 61 73 65 20  -set:lower-case 
0590: 20 63 68 61 72 2d 73 65 74 3a 75 70 70 65 72 2d   char-set:upper-
05a0: 63 61 73 65 20 20 63 68 61 72 2d 73 65 74 3a 74  case  char-set:t
05b0: 69 74 6c 65 2d 63 61 73 65 0a 20 20 20 20 63 68  itle-case.    ch
05c0: 61 72 2d 73 65 74 3a 6c 65 74 74 65 72 20 20 20  ar-set:letter   
05d0: 20 20 20 63 68 61 72 2d 73 65 74 3a 64 69 67 69     char-set:digi
05e0: 74 20 20 20 20 20 20 20 63 68 61 72 2d 73 65 74  t       char-set
05f0: 3a 6c 65 74 74 65 72 2b 64 69 67 69 74 0a 20 20  :letter+digit.  
0600: 20 20 63 68 61 72 2d 73 65 74 3a 67 72 61 70 68    char-set:graph
0610: 69 63 20 20 20 20 20 63 68 61 72 2d 73 65 74 3a  ic     char-set:
0620: 70 72 69 6e 74 69 6e 67 20 20 20 20 63 68 61 72  printing    char
0630: 2d 73 65 74 3a 77 68 69 74 65 73 70 61 63 65 0a  -set:whitespace.
0640: 20 20 20 20 63 68 61 72 2d 73 65 74 3a 69 73 6f      char-set:iso
0650: 2d 63 6f 6e 74 72 6f 6c 20 63 68 61 72 2d 73 65  -control char-se
0660: 74 3a 70 75 6e 63 74 75 61 74 69 6f 6e 20 63 68  t:punctuation ch
0670: 61 72 2d 73 65 74 3a 73 79 6d 62 6f 6c 0a 20 20  ar-set:symbol.  
0680: 20 20 63 68 61 72 2d 73 65 74 3a 68 65 78 2d 64    char-set:hex-d
0690: 69 67 69 74 20 20 20 63 68 61 72 2d 73 65 74 3a  igit   char-set:
06a0: 62 6c 61 6e 6b 20 20 20 20 20 20 20 63 68 61 72  blank       char
06b0: 2d 73 65 74 3a 61 73 63 69 69 0a 20 20 20 20 63  -set:ascii.    c
06c0: 68 61 72 2d 73 65 74 3a 65 6d 70 74 79 20 20 20  har-set:empty   
06d0: 20 20 20 20 63 68 61 72 2d 73 65 74 3a 66 75 6c      char-set:ful
06e0: 6c 0a 20 20 20 20 29 0a 20 20 28 69 6d 70 6f 72  l.    ).  (impor
06f0: 74 0a 20 20 20 20 28 65 78 63 65 70 74 20 28 72  t.    (except (r
0700: 6e 72 73 29 20 64 65 66 69 6e 65 2d 72 65 63 6f  nrs) define-reco
0710: 72 64 2d 74 79 70 65 29 0a 20 20 20 20 28 72 6e  rd-type).    (rn
0720: 72 73 20 6d 75 74 61 62 6c 65 2d 73 74 72 69 6e  rs mutable-strin
0730: 67 73 29 0a 20 20 20 20 28 72 6e 72 73 20 72 35  gs).    (rnrs r5
0740: 72 73 29 0a 20 20 20 20 28 73 72 66 69 20 73 32  rs).    (srfi s2
0750: 33 20 65 72 72 6f 72 20 74 72 69 63 6b 73 29 0a  3 error tricks).
0760: 20 20 20 20 28 73 72 66 69 20 73 39 20 72 65 63      (srfi s9 rec
0770: 6f 72 64 73 29 0a 20 20 20 20 28 73 72 66 69 20  ords).    (srfi 
0780: 70 72 69 76 61 74 65 20 6c 65 74 2d 6f 70 74 29  private let-opt)
0790: 0a 20 20 20 20 28 73 72 66 69 20 70 72 69 76 61  .    (srfi priva
07a0: 74 65 20 69 6e 63 6c 75 64 65 29 29 0a 20 20 0a  te include)).  .
07b0: 20 20 28 64 65 66 69 6e 65 20 28 25 6c 61 74 69    (define (%lati
07c0: 6e 31 2d 3e 63 68 61 72 20 69 29 0a 20 20 20 20  n1->char i).    
07d0: 28 69 6e 74 65 67 65 72 2d 3e 63 68 61 72 20 69  (integer->char i
07e0: 29 29 0a 20 20 0a 20 20 28 64 65 66 69 6e 65 20  )).  .  (define 
07f0: 28 25 63 68 61 72 2d 3e 6c 61 74 69 6e 31 20 63  (%char->latin1 c
0800: 29 0a 20 20 20 20 28 63 68 61 72 2d 3e 69 6e 74  ).    (char->int
0810: 65 67 65 72 20 63 29 29 0a 20 20 20 20 20 20 0a  eger c)).      .
0820: 20 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78    (define-syntax
0830: 20 63 68 65 63 6b 2d 61 72 67 0a 20 20 20 20 28   check-arg.    (
0840: 6c 61 6d 62 64 61 20 28 73 74 78 29 0a 20 20 20  lambda (stx).   
0850: 20 20 20 28 73 79 6e 74 61 78 2d 63 61 73 65 20     (syntax-case 
0860: 73 74 78 20 28 29 0a 20 20 20 20 20 20 20 20 5b  stx ().        [
0870: 28 5f 20 70 72 65 64 20 76 61 6c 20 63 61 6c 6c  (_ pred val call
0880: 65 72 29 0a 20 20 20 20 20 20 20 20 20 28 69 64  er).         (id
0890: 65 6e 74 69 66 69 65 72 3f 20 23 27 76 61 6c 29  entifier? #'val)
08a0: 0a 20 20 20 20 20 20 20 20 20 23 27 28 75 6e 6c  .         #'(unl
08b0: 65 73 73 20 28 70 72 65 64 20 76 61 6c 29 0a 20  ess (pred val). 
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 61 73 73              (ass
08d0: 65 72 74 69 6f 6e 2d 76 69 6f 6c 61 74 69 6f 6e  ertion-violation
08e0: 20 63 61 6c 6c 65 72 20 22 63 68 65 63 6b 2d 61   caller "check-a
08f0: 72 67 20 66 61 69 6c 65 64 22 20 76 61 6c 29 29  rg failed" val))
0900: 5d 29 29 29 0a 20 20 0a 20 20 28 53 52 46 49 2d  ]))).  .  (SRFI-
0910: 32 33 2d 65 72 72 6f 72 2d 3e 52 36 52 53 20 22  23-error->R6RS "
0920: 28 6c 69 62 72 61 72 79 20 28 73 72 66 69 20 73  (library (srfi s
0930: 31 34 20 63 68 61 72 2d 73 65 74 73 29 29 22 0a  14 char-sets))".
0940: 20 20 20 28 69 6e 63 6c 75 64 65 2f 72 65 73 6f     (include/reso
0950: 6c 76 65 20 28 22 73 72 66 69 22 20 22 73 31 34  lve ("srfi" "s14
0960: 22 29 20 22 73 72 66 69 2d 31 34 2e 73 63 6d 22  ") "srfi-14.scm"
0970: 29 29 29 0a                                      ))).