www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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))