(module define-utils mzscheme
(require
(only (lib "etc.ss") hash-table)
(all-except (lib "contract.ss") ->)
(rename (lib "contract.ss") => ->))
(provide define/provide
define-struct/provide
define-struct/provide/contract)
(define-syntax define/provide
(syntax-rules ()
[(_ id val ...)
(begin
(define id val ...)
(provide id))]))
(define-syntax define-struct/provide
(syntax-rules ()
[(_ id (names ...) ins)
(begin
(define-struct id (names ...) ins)
(provide (struct id (names ...))))]
[(_ id (names ...))
(begin
(define-struct id (names ...))
(provide (struct id (names ...))))]))
(define-syntax define-struct/provide/contract
(syntax-rules ()
[(_ id ([names types] ...) ins)
(begin
(define-struct id (names ...) ins)
(provide/contract (struct id ([names types] ...))))]
[(_ id ([names types] ...))
(begin
(define-struct id (names ...))
(provide/contract (struct id ([names types] ...))))]))
(define-syntax define-symbols
(syntax-rules ()
[(_ id)
(define/provide id (quote id))]
[(_ id ids ...)
(begin
(define-symbols id)
(define-symbols ids ...))]))
)