For the upcoming version of WeScheme, I'm planning to use the real 'compile' from Racket. I'm trying to better understand a part of the compilation system. Here's a sample program I'm using to play:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #lang racket/base (define ns (make-base-namespace)) (define (do-compilation program) (parameterize ([current-namespace ns] [read-accept-reader #t]) (define bytes (compile (read-syntax #f (open-input-string program)))) (define op (open-output-bytes)) (write bytes op) (get-output-bytes op))) (define (do-compilation/fresh program) (parameterize ([current-namespace (make-base-namespace)] [read-accept-reader #t]) (define bytes (compile (read-syntax #f (open-input-string program)))) (define op (open-output-bytes)) (write bytes op) (get-output-bytes op))) (time (for ([i 1000]) (void (do-compilation "#lang racket/base\n\n(printf \"Hello world\")")))) (time (for ([i 1000]) (void (do-compilation/fresh "#lang racket/base\n\n(printf \"Hello world\")")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; I see that the first do-compilation, the one that shares a namespace, runs faster than the version that generates fresh namespaces. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; kui ~ $ racket measure-compile-time.rkt cpu time: 2244 real time: 2242 gc time: 172 cpu time: 5244 real time: 6144 gc time: 516 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; I assume that the reason for the difference is because the first version touches some namespace state that's used as a part of compilation, so that future compilations can reuse that state. Question: is the first version vulnerable to a memory leak? That is, let's say that I enforce all programs going through do-compilation to be in a hardcoded set of designated #langs. Do I run the risk of exhausting memory? Thanks! ____________________ Racket Users list: http://lists.racket-lang.org/users