формат - Помощь с печатью таблицы - PullRequest
6 голосов
/ 06 января 2011

Этот вопрос, вероятно, закончится лицевой маской, но я пытался некоторое время и все еще застрял, несмотря на чтение через гиперспек.

По сути, я хочу сделать что-то вроде

(format t "~{|~{ ~5d~}|~%~}" '((1 23 2 312) (23 456 1 7890)))

но вместо жесткого кодирования 5 его следует рассчитать из списка (длина самого длинного элемента из любого вложенного списка + 1), чтобы получить что-то вроде

|    1    23     2   312|
|   23   456     1  7890|      

Может быть, я так думаюздесь слишком сложно, и есть более простой способ делать то, что я хочу, но я думаю, что я запал в ментальный угол, из которого я не могу выйти.

Ответы [ 2 ]

5 голосов
/ 06 января 2011

Я думаю, что у вас есть два варианта: отпустить магию format и использовать другие циклические конструкции или сгенерировать саму строку формата:

(defun facepalm-printer (lol)
  (format t (format nil "~~{|~~{ ~~~ad~~}|~~%~~}"
                    (longest-member lol))
          lol))

Определение longest-member оставлено читателю в качестве упражнения.

4 голосов
/ 06 января 2011

Если необходимая ширина привязана к width, то вы можете сделать это:

(format t "~{|~{ ~Vd~}|~%~}" width '((1 23 2 312) (23 456 1 7890)))

5 было заменено на V, а width добавлено какаргумент FORMAT /

редактировать: исходный ответ некорректно учитывал вложенные директивы

В строке управления форматом V может бытьиспользуется вместо любого постоянного значения, указывая, что соответствующее значение должно быть взято из списка аргументов.

Вы можете попробовать это:

(setf width 5)
(setf data '((1 23 2 312) (23 456 1 7890)))

(format t "~{|~{ ~{~Vd~}~}|~%~}"
  (mapcar #'(lambda (r) (mapcar #'(lambda (v) (list width v)) r)) data) )

Эта строка формата требует желаемой шириныпредшествовать каждому значению.Выражение (mapcar ...) выполняет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...