;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:CL -*- ;;; Versions that accept &rest args of strings (defun fill-strings(size &rest strings) (let*((spacel (ncons #\space))) (mapcar #'(lambda(s) (fillarray (make-string size) (append (map 'list #'char-int s) spacel))) strings))) (defun fill-strings-max (&rest strings) (apply #'fill-strings (apply #'max (mapcar #'string-length strings)) strings)) (defun fill-strings-min (&rest strings) (apply #'fill-strings (apply #'min (mapcar #'string-length strings)) strings)) (defun fill-strings-from-first(string1 &rest strings) (apply #'fill-strings (string-length string1) string1 strings)) ;;; Versions that require arg of list of strings (defun fill-list-strings(size strings) (apply #'fill-strings size strings)) (defun fill-list-strings-max (strings) (funcall #'fill-list-strings (apply #'max (mapcar #'string-length strings)) strings)) (defun fill-list-strings-min (strings) (funcall #'fill-list-strings (apply #'min (mapcar #'string-length strings)) strings)) (defun fill-list-strings-from-first(strings) (when (car strings) (funcall #'fill-list-strings (string-length (car strings)) strings))) ;;; Friendly printing utilities for filled columns of strings (defun line-print-filled-strings(strings &optional (stream standard-output) (fmt "~&~a")) (dolist(str strings) (format stream fmt str))) (defun column-print-filled-strings(strings &optional (stream standard-output)) (line-print-filled-strings strings stream "~&|~a|")) (defun column-print-strings(strings &optional (mode :max) (stream standard-output)) "Mode can be :MAX, :MIN, :FIRST, or a fixnum size" (column-print-filled-strings (cond ((eq mode :max) (fill-list-strings-max strings)) ((eq mode :min) (fill-list-strings-min strings)) ((eq mode :first) (fill-list-strings-from-first strings)) ((fixnump mode) (fill-list-strings mode strings)) (t (ferror "Invalid mode = ~s" mode))) stream))