[plt-scheme] one macro in another?
This is roughly what I'm trying to accomplish:
(define-syntax transaction
(lambda (stx)
(syntax-case stx ()
[(_ expr ...)
#`(let ([final-proc #f])
#,(define-syntax finally
(lambda (stx)
(syntax-case stx ()
[(_ exp (... ...))
(syntax (set! final-proc (lambda () exp (... ...))))])))
(let ([v (begin
expr ...)])
(when (procedure? final-proc)
(final-proc)
v)))])))
But you can't stick define-syntax in let.
A pointer in the right direction would be appreciated. I have a
feeling I need some kind of with-syntax or let-syntax thingy, but
I havn't had the first bit of luck figuring that out.
The goal, for what it is worth, is to be able to write something like
(transaction
(set-account-balance (+ 10 (read-account-balance)))
(finally (printf "account balance updated~n")))
or even
(transaction
(let ([new-balance (+ 10 (read-account-balance))])
(set-account-balance new-balance)
(finally (printf "new balance is: ~a~n" new-balance))))
and have some behind-the-scenes logic rerun the transaction body as
necessary to deal with serialization or deadlock errors, and then at
the very end just run the finally block.
--
Jay Kominek <jkominek at miranda.org>