20 lines
884 B
Racket
20 lines
884 B
Racket
#lang racket/base
|
|
(require (for-syntax racket/base file/gunzip net/base64))
|
|
(provide (except-out (all-from-out racket/base) #%module-begin)
|
|
(rename-out [module-begin #%module-begin]))
|
|
|
|
(define-syntax (module-begin stx)
|
|
(syntax-case stx ()
|
|
[(_ x ...)
|
|
(andmap (lambda (x) (or (identifier? x) (integer? (syntax-e x))))
|
|
(syntax->list #'(x ...)))
|
|
(let* ([data (format "~a" (syntax->datum #'(x ...)))]
|
|
[data (substring data 1 (sub1 (string-length data)))]
|
|
[data (string->bytes/utf-8 data)]
|
|
[in (open-input-bytes (base64-decode data))]
|
|
[out (open-output-string)]
|
|
[out (begin (inflate in out) (get-output-string out))]
|
|
[exprs (read (open-input-string (string-append "(" out ")")))]
|
|
[exprs (datum->syntax stx exprs stx)])
|
|
#`(#%module-begin #,@exprs))]))
|