(require "printer.ss") (define max-offset 78) (define indent-step 2) (define (overflowed? offset) (>= offset max-offset)) (define (print-spaces n port) (print-raw (make-string n #\space) port)) (define (print-list-body offset lis port) (define (next-line) (print-raw "\n" port) (print-spaces offset port)) (cond ((pair? lis) (next-line) (pretty-print-any offset (car lis) port) (print-list-body offset (cdr lis) port)) ((not (null? lis)) (next-line) (print-raw "." port) (next-line) (pretty-print-any offset lis port)))) (define (pretty-print-list offset lis port) (let* ((s (print-to-string lis)) (ending (+ offset (string-length s)))) (cond ((overflowed? ending) (print-raw "(" port) (pretty-print-any (+ 1 offset) (car lis) port) (print-list-body (+ offset indent-step) (cdr lis) port) (print-raw ")" port)) (else (print-raw s port))))) (define (print-vector-body offset i vec port) (unless (= i (vector-length vec)) (print-raw "\n" port) (print-spaces offset port) (pretty-print-any offset (vector-ref vec i) port) (print-vector-body offset (+ i 1) vec port))) (define (pretty-print-vector offset vec port) (let* ((s (print-to-string vec)) (ending (+ offset (string-length s))) (n (vector-length vec))) (cond ((overflowed? ending) (print-raw "#(" port) (unless (zero? n) (pretty-print-any (+ 2 offset) (vector-ref vec 0) port) (print-vector-body (+ offset indent-step) 1 vec port)) (print-raw ")" port)) (else (print-raw s port))))) (define (pretty-print-any offset obj port) (cond ((pair? obj) (pretty-print-list offset obj port)) ((vector? obj) (pretty-print-vector offset obj port)) (else (print obj port)))) (define (pretty-print obj port) (pretty-print-any 0 obj port))