[racket] need feedback on syntax-expanding/rewriting image-snips

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Tue Aug 9 15:50:02 EDT 2011

I think you should be working with the wxme library, not with image
snips directly. Did you investigate that?


On Tue, Aug 9, 2011 at 2:39 PM, Danny Yoo <dyoo at cs.wpi.edu> wrote:
> I'm trying to support image snips in Whalesong.  I think I have
> something working, but wanted to run it by folks on the list to make
> sure I haven't done something incredibly silly.
> One of the problems that comes up is due to architecture: Whalesong
> uses compiler/zo-parse, and compiler/zo-parse only takes in input
> ports.  I have to dance through a few hoops to get an appropriate
> input port.
>    1. Given a path, I try calling get-module-code from the
> syntax/modcode collection.
>    2. I then take that compiled-code value and write it into one end
> of an output-string-port, and then create a fresh string input port
> for use with zo-parse, since zo-parse needs a pipe that supports
> file-position.
> The code ends up looking like this:
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> #lang racket
> (require syntax/modcode
>         compiler/zo-parse)
> ;; path_>bytecode-port: path->port
> ;; Consumes the path to a Racket module, and produces a bytecode-port that's
> ;; suitable for use with compiler/zo-parse.
> (define (path->bytecode-port a-path)
>  (parameterize ([current-namespace (make-base-namespace)])
>    (define code (get-module-code a-path))
>    (define outp (open-output-bytes))
>    (write code outp)
>    (open-input-bytes (get-output-bytes outp))))
> (define some-toplevel-structure
>  (zo-parse
>   (path->bytecode-port
>    (build-path "/home/dyoo/work/whalesong/examples/hello.rkt"))))
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> This works.  Sorta.  The difficulty lies when I deal with files that
> have embedded snips in them, because the inner call to write fails:
> snips don't serialize.
> I end up having to do something a bit more elaborate: I don't use
> get-module-code directly, but instead do the following:
>    1.  read-syntax and expand to get a fully expanded syntax.
>    2.  inject a helper module of my own that can create images out of
> url strings.
>    3.  walk the expanded syntax tree and replace the image snips with
> calls to that image-url helper function.
>    4.  finally, compile to bytecode and write it to my port, which
> works because the image snips are replaced with vanilla function
> calls.
> The whole thing is in:
>    https://github.com/dyoo/whalesong/blob/master/get-module-bytecode.rkt
>    https://github.com/dyoo/whalesong/blob/master/expand-out-images.rkt
> It's a bit more elaborate.  I'm nervous particularly about
> expand-out-images.rkt.  I have no idea if I'm doing it right.  In
> fact, in some sense, I'm sure I'm doing something wrong: I don't quite
> know what to do if the original program defines its own bindings that
> clash with the image library.  At the moment, if you look at how I'm
> defining my-image-url in expand-out-images.rkt, I'm parameterizing it
> with the value I get out of generate-temporaries, just to try to avoid
> the name clash.  Suggestions would be greatly appreciated here.
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users

Posted on the users mailing list.