/ gui-lib / framework / private / decode.rkt
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))]))