decode.rkt
1 #lang racket/base 2 (require (for-syntax racket/base file/gunzip net/base64)) 3 (provide (except-out (all-from-out racket/base) #%module-begin) 4 (rename-out [module-begin #%module-begin])) 5 6 (define-syntax (module-begin stx) 7 (syntax-case stx () 8 [(_ x ...) 9 (andmap (lambda (x) (or (identifier? x) (integer? (syntax-e x)))) 10 (syntax->list #'(x ...))) 11 (let* ([data (format "~a" (syntax->datum #'(x ...)))] 12 [data (substring data 1 (sub1 (string-length data)))] 13 [data (string->bytes/utf-8 data)] 14 [in (open-input-bytes (base64-decode data))] 15 [out (open-output-string)] 16 [out (begin (inflate in out) (get-output-string out))] 17 [exprs (read (open-input-string (string-append "(" out ")")))] 18 [exprs (datum->syntax stx exprs stx)]) 19 #`(#%module-begin #,@exprs))]))