private: No


(define trace--indent " ")

(define-syntax trace-define
  (syntax-rules ()
    ((_ (name args ...) body ...)
     (define (name args ...)
       (for-each display (list trace--indent "(" (quote name)))
       (for-each display (list " " args)) ...
       (display ")\n")
       (let ((old-indent trace--indent)
             (return
              (begin
                (set! trace--indent (string-append trace--indent ": "))
                body ...)))
         (set! trace--indent old-indent)
         (unless (equal? trace--indent " ")
           (for-each display (list trace--indent return "\n")))
         return)))))

(define-syntax trace-lambda
  (syntax-rules ()
    ((_ name (args ...) body ...)
     (lambda (args ...)
       (trace-define (name args ...) body ...)
       (name args ...)))))

(define-syntax trace-let
  (syntax-rules ()
    ((_ name ((keys values) ...) body ...)
     ((lambda ()
       (trace-define (name keys ...) body ...)
       (name values ...))))))

(define-syntax trace
  (syntax-rules ()
    ((_ exp)
     (let ((result exp))
       (for-each display (list trace--indent result "\n"))
       result))))