lang/dracula-module-begin.ss
#lang scheme

(require "../private/define-below.ss"
         "../teachpacks/testing.ss"
         "../teachpacks/doublecheck.ss"
         (for-syntax "../proof/proof.ss" "../proof/syntax.ss"))

(provide dracula-module-begin)

(define-syntax (dracula-module-begin stx)
  (syntax-case stx ()
    [(_ form ...)
     (with-syntax ([exports (datum->syntax stx `(,#'all-defined-out))])
       (quasisyntax/loc stx
         (#%module-begin
          (define-values []
            #,(annotate-proof
               (make-proof
                (make-part
                 'Dracula
                 (syntax->loc stx)
                 (map syntax->term (syntax->list #'(form ...)))))
               (syntax/loc stx (values))))
          (provide exports)
          (begin-below form ...)
          (generate-report!)
          (check-properties!))))]))