print-table.scm 908 B

123456789101112131415161718192021222324252627282930313233
  1. (define (display-times s n)
  2. (if (<= n 0)
  3. #f
  4. (begin
  5. (display s)
  6. (display-times s (- n 1)))))
  7. (define (pass-col cols maxes)
  8. (if (null? cols)
  9. (lambda () (newline))
  10. (let* ((col (car cols))
  11. (col-max (car maxes))
  12. (col-len (string-length col))
  13. (col-max* (max col-len (unbox col-max)))
  14. (k (pass-col (cdr cols) (cdr maxes))))
  15. (set-box! col-max col-max*)
  16. (lambda ()
  17. (display col)
  18. (display-times " " (+ 1 (- (unbox col-max) col-len)))
  19. (k)))))
  20. (define (pass1 table maxes)
  21. (if (null? table)
  22. (lambda () #f)
  23. (let* ((row (car table))
  24. (col (pass-col row maxes))
  25. (k (pass1 (cdr table) maxes)))
  26. (lambda () (col) (k)))))
  27. (define (print-table table)
  28. (let ((maxes (map (lambda (col) (box 0)) (car table))))
  29. ((pass1 table maxes))))