[racket] read-syntax for an entire .rkt file

From: Sam Tobin-Hochstadt (samth at cs.indiana.edu)
Date: Wed Feb 18 22:35:20 EST 2015

On Wed, Feb 18, 2015 at 10:22 PM, Thomas Gilray <thomas.gilray at gmail.com> wrote:
> Hi everyone,
>
> I am trying to figure out how to use read-syntax on a port for an entire
> .rkt file. I then want to call (expand ...) on this and get back a (begin
> ...) or (module ...) for the entire file in fully expanded form.
>
> If I run (expand #`(define ...)) under a #lang racket, everything works. If
> I place this in a file and use read-syntax however, each top-level
> expression is returned individually, the language declaration isn't
> supported, and without this information the expander complains that "define"
> isn't defined. How do I properly read-syntax a whole file at once?
>
> Any ideas would be greatly appreciated.

I've implemented this a couple times recently, probably the best
version is here:
https://github.com/samth/pycket/blob/master/pycket/pycket-lang/expand.rkt

The short answer is that you want to use `read-accept-lang` to enable
#lang, call `read-syntax` once on the port, and the call `expand` in a
new namespace (probably created with `make-base-namespace`).

Sam

Posted on the users mailing list.