(module trace mzscheme (provide expose trace inc-indent dec-indent indent trace-number) (require (lib "defmacro.ss")) (define trace-number 0) (define (expose x s) (display s) (display x) (newline) x) (define (indent n) (when (> n 0) (display " ") (indent (- n 1)))) (define (inc-indent) (set! trace-number (+ trace-number 1))) (define (dec-indent) (set! trace-number (- trace-number 1))) (define-macro (trace define-form) (unless (eq? (car define-form) 'define) (error "Trace must be used with define forms")) (let ((callform (cadr define-form))) `(define ,callform (begin (inc-indent) (indent (* trace-number 3)) (display "Enter ") (display ',(car callform)) (display " ") ,@(map (lambda (arg) `(begin (display ,arg) (display " "))) (cdr callform)) (newline) (let ((*result* (begin ,@(cddr define-form)))) (indent (* 3 trace-number)) (display "Return ") (display *result*) (newline) (dec-indent) *result*))))) )