www

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

fully-expanded-grammar-no-set.rkt (3521B)


      1 #lang racket/base
      2 
      3 ;; This file is not used by the project, but can be used as a base for macros
      4 ;; which need to parse the result of local-expand. For example, the file
      5 ;; fully-expanded-grammar-extract-bindings.rkt is based on this one.
      6 
      7 (require (rename-in syntax/parse [...+ …+])
      8          (rename-in racket/base [... …])
      9          (for-template '#%kernel)
     10          (for-syntax racket/base))
     11 
     12 (provide disallow-set!-in-expression)
     13 
     14 (define whole-expr (make-parameter #f))
     15 
     16 (define (disallow-set!-in-expression e)
     17   (parameterize ([whole-expr e])
     18     (syntax-parse e [:expr 'ok])))
     19 
     20 (define-syntax-class top-level-form
     21   #:literals (#%expression module #%plain-module-begin begin begin-for-syntax)
     22   (pattern :general-top-level-form)
     23   (pattern (#%expression :expr))
     24   (pattern (module :id _module-path
     25              (#%plain-module-begin
     26               :module-level-form …)))
     27   (pattern (begin :top-level-form …))
     28   (pattern (begin-for-syntax :top-level-form …)))
     29  	 	 	 	 
     30 (define-syntax-class module-level-form
     31   #:literals (#%provide begin-for-syntax #%declare)
     32   (pattern :general-top-level-form)
     33   (pattern (#%provide _raw-provide-spec …))
     34   (pattern (begin-for-syntax :module-level-form …))
     35   (pattern :submodule-form)
     36   (pattern (#%declare _declaration-keyword …)))
     37  	 	 	 	 
     38 (define-syntax-class submodule-form
     39   #:literals (module #%plain-module-begin module* )
     40   (pattern (module :id _module-path
     41              (#%plain-module-begin
     42               :module-level-form …)))
     43   (pattern (module* :id _module-path
     44              (#%plain-module-begin
     45               :module-level-form …)))
     46   (pattern (module* :id #f
     47              (#%plain-module-begin
     48               :module-level-form …))))
     49   
     50 (define-syntax-class general-top-level-form
     51   #:literals (define-values define-syntaxes #%require)
     52   (pattern :expr)
     53   (pattern (define-values (:id …) :expr))
     54   (pattern (define-syntaxes (:id …) :expr))
     55   (pattern (#%require _raw-require-spec …)))
     56  	 	 	 	 
     57 (define-syntax-class expr
     58   #:literals (lambda case-lambda if begin begin0
     59                let-values letrec-values letrec-syntaxes+values
     60                set! quote quote-syntax
     61                with-continuation-mark
     62                #%app #%top #%expression #%variable-reference)
     63   (pattern :id)
     64   (pattern (lambda :formals :expr …+))
     65   (pattern (case-lambda (:formals :expr …+) …))
     66   (pattern (if :expr :expr :expr))
     67   (pattern (begin :expr …+))
     68   (pattern (begin0 :expr :expr …))
     69              
     70   (pattern (let-values ([(:id …) :expr] …)
     71              :expr …+))
     72   (pattern (letrec-values ([(:id …) :expr] …)
     73              :expr …+))
     74   (pattern (letrec-syntaxes+values ([(:id …) :expr] …)
     75              ([(:id …) :expr] …)
     76              :expr …+))
     77   (pattern {~and whole-set ({~and set-id set!} :id :expr)}
     78            #:do [(raise-syntax-error
     79                   'pure
     80                   "set! is disallowed within pure/stateless and similar forms"
     81                   #'whole-expr
     82                   #'whole-set
     83                   (list #'set-id))])
     84   (pattern (quote _datum))
     85   (pattern (quote-syntax _datum))
     86   (pattern (quote-syntax _datum #:local))
     87   (pattern (with-continuation-mark :expr :expr :expr))
     88   (pattern (#%app :expr …+))
     89   (pattern (#%top . :id))
     90   (pattern (#%expression :expr))
     91   (pattern (#%variable-reference :id))
     92   (pattern (#%variable-reference (#%top . :id)))
     93   (pattern (#%variable-reference)))
     94 
     95 (define-syntax-class formals
     96   (pattern (:id …))
     97   (pattern (:id …+ . :id))
     98   (pattern :id))