[plt-scheme] Resources in the transformer environment

From: Jon Zeppieri (zeppieri at gmail.com)
Date: Fri Oct 27 18:04:42 EDT 2006

Eh, I figured out the problem from this:

http://list.cs.brown.edu/pipermail/plt-scheme/2003-July/003177.html

It appears to be working now that I added letrec-syntaxes+values to
the stop list for local-expand.

-Jon


On 10/27/06, Jon Zeppieri <zeppieri at gmail.com> wrote:
> Hi,
>
> So, I've attempted to implement the macro suggested below:
>
> On Fri, 27 Oct 2006 08:13:22 0800, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> > Would it make sense to have a form like
> >
> >  (with-database
> >   "host.domain.foo" 3306 "my_username" "my_password" "my_schema"
> >   <body>)
> >
> > that opened the database both a compile time and at run time? The macro
> > might be implemented as mostly
> >
> >   (dynamic-wind
> >    (lambda () <...open the database...>)
> >    (lambda () ... (local-expand <body> ...) ...)
> >    (lambda () <...close the database...>))
> >
> > but the expansion of <body> would also be wrapped with a similar
> > `dynamic-wind' to perform the same DB open and close.
>
> Here is the code:
>
>   (define-syntax (with-database stx)
>     (syntax-case stx ()
>       ((_ (host port username password schema) body-expr ...)
>        (dynamic-wind (lambda ()
>                        (display "opening transformer DB connection\n")
>                        (current-connection (connect
> (syntax-object->datum #'host)
>
> (syntax-object->datum #'port)
>
> (syntax-object->datum #'username)
>
> (syntax-object->datum #'password)
>
> (syntax-object->datum #'schema))))
>                      (lambda ()
>                        (local-expand #'(dynamic-wind (lambda ()
>                                                        (display
> "opening runtime DB connection\n")
>
> (current-connection (connect host port username password schema)))
>                                                      (lambda ()
>                                                        body-expr ...)
>                                                      (lambda ()
>                                                        (display
> "closing runtime DB connection\n")
>                                                        (close
> (current-connection))))
>                                      (syntax-local-context)
>                                      '()))
>                      (lambda ()
>                        (display "closing transformer DB connection\n")
>                        (close (current-connection)))))))
>
>
> When I attempt to use it, however, there is a problem:
>
> (module foo mzscheme
>
>   (require (lib "dbo.ss" "dbo"))
>
>   (with-database (<host> <port> <username> <password> <schema>)
>     (define project%
>       (dbo-class* "project" object% ()
>                   (super-new)))
>
>     (define o (make-object project%))
>     (define ps (send o find #:all))
>     (display ps))
> )
>
> ...results in...
>
> opening transformer DB connection
> closing transformer DB connection
> compile: identifier used out of context in: local-accessor
>
>
> Perhaps I'm expanding the body in the wrong context?
>
> -Jon
>


Posted on the users mailing list.