Aha, combining enter! with dynamic-require seems to do the trick: (define (route req) (enter! "module.rkt") (define foo (dynamic-require "module.rkt" 'foo)) (response/xexpr `(p ,(format "~a" foo))))
Once this route is running in the web server, I can make changes to module.rkt, then click reload in the browser, and the changes will appear in the browser. If this is a terrible idea let me know, otherwise I'll consider this solved. On Sat, Apr 27, 2013 at 9:56 AM, Matthew Butterick <mb.list.a...@gmail.com>wrote: > I'm building a website using Scribble as the source format. As a > development tool, I've built a web server in Python that lets me view all > my Scribble source files and look at them in different states of > processing. To view the results of the Scribble files, the Python server > just sends the files to Racket via a system command (os.Popen) and reads > the result. This works but it's slow, because it has to launch a new > Racket thread for every request. > > I thought I could speed things up by rewriting the development web server > in Racket. But having tried a few approaches, I'm not sure how to duplicate > this functionality within a Racket web servlet: > > *(require <modulename>) * > This only gets evaluated once, when the server is started. That doesn't > help, since the <filename> is going to be passed in as a parameter while > the server is running. > > *(dynamic-require <** modulename **>) * > This gets evaluated only when invoked, and thus can take <modulename> as a > parameter, but then <filename> can't be reloaded (this is essential, as the > point of the system is to be able to edit the files and see the changes in > the web browser immediately) > > *(enter! <modulename>)* > This reloads the file, but it's not clear how to get access to names > provided by <modulename>. (The documentation for enter! suggests that this > is not how it's meant to be used anyhow.) > > Obviously, I could call a new instance of Racket as a system command, but > that wouldn't offer any advantage over the current approach. > > > I suppose what I'm looking for is an equivalent of the Python > reload(<modulename>) command. > > > Matthew Butterick >
____________________ Racket Users list: http://lists.racket-lang.org/users