1#lang racket/base 2(require '#%linklet 3 racket/pretty 4 "../run/status.rkt") 5 6(provide compile-and-decompile) 7 8(define (compile-and-decompile linklet-expr print-extracted-to #:as-bytecode? as-bytecode?) 9 (log-status "Compiling and decompiling linklet to ~a" print-extracted-to) 10 11 (define linklet (compile-linklet linklet-expr)) 12 13 (define out (open-output-bytes)) 14 (write (hash->linklet-bundle (hasheq 0 linklet)) out) 15 16 (call-with-output-file* 17 print-extracted-to 18 #:exists 'truncate/replace 19 (lambda (o) 20 (if as-bytecode? 21 (write-bytes (get-output-bytes out) o) 22 (let* ([i (open-input-bytes (get-output-bytes out))] 23 ;; Dynamically load decompiler, so that it's not otherwise a 24 ;; dependency for running the expander-flattener 25 [zo ((dynamic-require 'compiler/zo-parse 'zo-parse) i)] 26 [decompiled-expr ((dynamic-require 'compiler/decompile 'decompile) zo)]) 27 (pretty-write decompiled-expr o)))))) 28