lib.rkt (2578B)
1 #lang racket/base 2 (require "sc.rkt" 3 syntax/parse/private/keywords 4 (for-syntax racket/base)) 5 6 (provide identifier 7 boolean 8 str 9 character 10 keyword 11 number 12 integer 13 exact-integer 14 exact-nonnegative-integer 15 exact-positive-integer 16 17 id 18 nat 19 char 20 21 expr 22 static) 23 24 25 (define (expr-stx? x) 26 (not (keyword-stx? x))) 27 28 (define ((stxof pred?) x) (and (syntax? x) (pred? (syntax-e x)))) 29 (define keyword-stx? (stxof keyword?)) 30 (define boolean-stx? (stxof boolean?)) 31 (define string-stx? (stxof string?)) 32 (define char-stx? (stxof char?)) 33 (define number-stx? (stxof number?)) 34 (define integer-stx? (stxof integer?)) 35 (define exact-integer-stx? (stxof exact-integer?)) 36 (define exact-nonnegative-integer-stx? (stxof exact-nonnegative-integer?)) 37 (define exact-positive-integer-stx? (stxof exact-positive-integer?)) 38 39 ;; == Integrable syntax classes == 40 41 (define-integrable-syntax-class identifier (quote "identifier") identifier?) 42 (define-integrable-syntax-class expr (quote "expression") expr-stx?) 43 (define-integrable-syntax-class keyword (quote "keyword") keyword-stx?) 44 (define-integrable-syntax-class boolean (quote "boolean") boolean-stx?) 45 (define-integrable-syntax-class character (quote "character") char-stx?) 46 (define-integrable-syntax-class str (quote "string") string-stx?) 47 (define-integrable-syntax-class number (quote "number") number-stx?) 48 (define-integrable-syntax-class integer (quote "integer") integer-stx?) 49 (define-integrable-syntax-class exact-integer (quote "exact-integer") exact-integer-stx?) 50 (define-integrable-syntax-class exact-nonnegative-integer 51 (quote "exact-nonnegative-integer") 52 exact-nonnegative-integer-stx?) 53 (define-integrable-syntax-class exact-positive-integer 54 (quote "exact-positive-integer") 55 exact-positive-integer-stx?) 56 57 ;; Aliases 58 (define-syntax id (make-rename-transformer #'identifier)) 59 (define-syntax nat (make-rename-transformer #'exact-nonnegative-integer)) 60 (define-syntax char (make-rename-transformer #'character)) 61 62 ;; == Normal syntax classes == 63 64 (define notfound (box 'notfound)) 65 66 (define-syntax-class (static pred [name #f]) 67 #:attributes (value) 68 #:description name 69 #:commit 70 (pattern x:id 71 #:fail-unless (syntax-transforming?) 72 "not within the dynamic extent of a macro transformation" 73 #:attr value (syntax-local-value #'x (lambda () notfound)) 74 #:fail-when (eq? (attribute value) notfound) #f 75 #:fail-unless (pred (attribute value)) #f))