private/define-utils.ss
(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)
  
  ;; Defines and provides
  (define-syntax define/provide
    (syntax-rules ()
      [(_ id val ...)
       (begin
         (define id val ...)
         (provide id))]))
  
  
  
  ;; Defines a structure and provides it
  (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 ...))))]))
  
  
  ;; Defines a structure and provides it with a contract
  (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-symbols : identifier ...
  ;; Defines/provides all identifiers as symbols
  (define-syntax define-symbols
    (syntax-rules ()
      [(_ id)
       (define/provide id (quote id))]
      [(_ id ids ...)
       (begin
         (define-symbols id)
         (define-symbols ids ...))]))
  
  )