www

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

hygienic-reader-extension--extend-reader--unhygienic.rkt (1038B)


      1 #lang racket
      2 
      3 ;; Copied and adjusted from
      4 ;; https://github.com/AlexKnauth/hygienic-reader-extension
      5 ;;   /blob/master/hygienic-reader-extension/extend-reader.rkt
      6 
      7 (provide extend-reader-unhygienic)
      8 
      9 ;; extend-reader : (-> (-> A ... Any)
     10 ;;                     (-> Readtable #:outer-scope (-> Syntax Syntax) Readtable)
     11 ;;                     (-> A ... Any))
     12 (define (extend-reader-unhygienic proc extend-readtable #:hygiene? [hygiene? #t])
     13   (lambda args
     14     (define orig-readtable (current-readtable))
     15     (define outer-scope (make-syntax-introducer/use-site))
     16     (parameterize ([current-readtable (extend-readtable orig-readtable #:outer-scope outer-scope)])
     17       (define stx (apply proc args))
     18       (if (and (syntax? stx) hygiene?)
     19           (outer-scope stx)
     20           stx))))
     21 
     22 ;; make-syntax-introducer/use-site : (-> (-> Syntax Syntax))
     23 (define (make-syntax-introducer/use-site)
     24   (cond [(procedure-arity-includes? make-syntax-introducer 1)
     25          (make-syntax-introducer #t)]
     26         [else
     27          (make-syntax-introducer)]))