(define trace--indent " ") (define-syntax trace-lambda (syntax-rules () ((_ name (args ...) body ...) (lambda (args ...) (define name (lambda (args ...) (for-each display (list trace--indent "(" (quote name))) (for-each display (list " " args)) ... (display ")\n") (let ((old-indent trace--indent) (return (begin (set! indent (string-append trace--indent ": ")) body ...))) (set! trace--indent old-indent) (for-each display (list trace--indent return "\n")) return))) (name args ...))))) (define-syntax trace-define (syntax-rules () ((_ (name args ...) body ...) (define name (trace-lambda name (args ...) body ...))))) (define-syntax trace-let (syntax-rules () ((_ name ((keys values) ...) body ...) ((trace-lambda name (keys ...) body ...) values ...)))) (define-syntax trace (syntax-rules () ((_ exp) (let ((result exp)) (display exp) exp))))