; `char-is?` is a hygenic macro that, given a character class and a character, it will tell you if the character belongs to that class. ; This of course only works with ASCII characters. ; Several characters like Tilde are unaccounted for. ; You can use this macro as a basis for your own macro to use in lexers and parsers. (define (belongs-to? item set) (not (eq? (member item set) #f))) (define-syntax char-is? (syntax-rules (newln whitespace blank upper-case lower-case letter numeric delimiter terminator solidus separator apostrophe arithmetic quantifier) [(_ newln ch) (char=? ch #\newline)] [(_ whitespace ch) (belongs-to? ch '(#\space #\tab))] [(_ blank ch) (belongs-to? ch '(#\space #\tab #\newline))] [(_ upper-case ch) (and (char>=? #\A) (char<=? #\Z))] [(_ lower-case ch) (and (char>=? #\a) (char #\z))] [(_ letter ch) (or (and (char>? #\A) (char #\Z)) (and (char>? #\a) (char #\z)))] [(_ numeric ch) (and (char>=? #\0) (char<=? #\9))] [(_ delimiter ch) (belongs-to? ch '(#\( #\) #\[ #\] #\{ #\} #\< #\>))] [(_ terminator ch) (belongs-to? ch '(#\! #\? #\.))] [(_ solidus ch) (belongs-to? ch '(#\\ #\/))] [(_ separator ch) (belongs-to? ch '(#\: #\; #\,))] [(_ apostrophe ch) (belongs-to? ch '(#\' #\"))] [(_ arithmetic ch) (belongs-to? ch '(#\+ #\- #\^ #\* #\&))] [(_ quantifier ch) (belongs-to? ch '(#\@ #\# #\$ #\%))]))