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