debug.ss
(module debug mzscheme
  
  (require
   (lib "etc.ss")
   (lib "pretty.ss")
   (file "base.ss")
   (file "log.ss")
   (file "parameter.ss")
   )

  (require-for-syntax
   (file "syntax.ss")
   )
  
  (provide
   (all-defined)
   )
  
  ;; parameter debug-enabled? : boolean
  (define-parameter debug-enabled?
    #t
    (lambda (val)
      (if (boolean? val)
          val
          (raise-exn/format exn:fail:unlib
           "Expected boolean, received ~a." val)))
    with-debug-enabled?)
  
  ;; debug : string 'a -> 'a
  ;;
  ;; Prints the value of the specified expression and then returns it
  ;; transparently.
  (define (debug message value)
    (if (debug-enabled?)
        (log-generic 'D (list message value))
        (void))
    value)
  
  (define-syntax (define-debug stx)
    (syntax-case stx ()
      [(debug-define var val)
       #`(define var (debug (symbol->string 'var) val))]))
  
  (define-syntax (let-debug stx)
    (syntax-case stx ()
      [(debug-let ([var val] ...) exp ...)
       #'(let ([var (debug (symbol->string 'var) val)] ...)
           exp ...)]))
       
  (define-syntax (let*-debug stx)
    (syntax-case stx ()
      [(debug-let* ([var val] ...) exp ...)
       #'(let* ([var (debug (symbol->string 'var) val)] ...)
           exp ...)]))
  
  (define-syntax (letrec-debug stx)
    (syntax-case stx ()
      [(debug-letrec ([var val] ...) exp ...)
       #'(letrec ([var (debug (symbol->string 'var) val)] ...)
           exp ...)]))

  )