pretty-sxml.scm 941 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. ;; Pretty print SXML
  2. (import (scheme base)
  3. (scheme write))
  4. (define (all-but-last-pair p)
  5. (if (pair? p)
  6. (reverse (cdr (reverse p)))
  7. '()))
  8. (define (last-pair p)
  9. (let loop ((in p))
  10. (if (pair? (cdr in))
  11. (loop (cdr in))
  12. in)))
  13. (define (pretty-print-sxml s port)
  14. (pretty-print-sxml-handler s port 0 #f))
  15. (define (pretty-print-sxml-handler s port level last-one?)
  16. (display (make-string level #\space) port)
  17. (cond
  18. ((list? s)
  19. (case (length s)
  20. ((1 2) (write s port))
  21. (else
  22. (display "(" port)
  23. (write (car s) port)
  24. (newline port)
  25. (for-each (lambda (s)
  26. (pretty-print-sxml-handler s port (+ level 1) #f))
  27. (all-but-last-pair (cdr s)))
  28. (pretty-print-sxml-handler (car (last-pair s)) port (+ level 1) #t)
  29. (display ")" port)))
  30. (if (not last-one?)
  31. (newline port)))
  32. (else
  33. (write s port))))