Используйте заполнение переменных в директиве итерации в FORMAT - PullRequest
0 голосов
/ 15 декабря 2018

Есть ли способ сделать что-то вроде следующего?

(format t "~{~va~}" '("aa" "bb" "cc") 4)

Мне нужно перебрать список.Каждый элемент этого списка должен быть дополнен переменным числом пробелов (указанных во время выполнения, поэтому я не могу использовать «~ 4a»).

Или, в более общем случае, есть ли способ обратиться к конкретному аргументу всписок аргументов FORMAT?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Вы также можете чередовать список с повторениями заполнения:

(format t "~{~va~}"
        (mapcan (lambda (element)
                  (list 4 element))
                list))
0 голосов
/ 16 декабря 2018

Вы можете построить строку управления форматом, используя вложенные функции форматирования, но тогда вам нужно позаботиться о экранировании тильд.При работе с регулярными выражениями (используя CL-PPCRE) можно определять регулярные выражения, используя деревья, например (:alternation #\\ #\*), что помогает предотвратить ошибки и головные боли, связанные с экранированием специальных символов.То же самое можно сделать со строками формата, используя format-string-builder, доступный в Quicklisp:

(lambda (v)
  (make-format-string `((:map () (:str ,v)))))

Возвращает замыкание, которое можно использовать для построения строк формата:

(funcall * 10)
=> "~{~10a~}"
0 голосов
/ 16 декабря 2018

Вложив функцию format, вы можете делать то, что хотите.

(format t (format nil "~~{~~~Aa~~}" 4) '("aa" "bb" "cc"))
;; returns: aa  bb  cc  

Здесь внутренняя директива format: nil в качестве первого аргумента, format возвращает строку.

(format nil "~~{~~~Aa~~}" 4)
;; returns: "~{~4a~}" - and this is exactly what you want to give
;; to the outer `format` as second argument!

Конечно, вы можете написать функцию для этого:

(defun format-by-padding-over (lst padding)
  (format t (format nil "~~{~~~Aa~~}" padding) lst))

А затем:

(format-by-padding-over '("aa" "bb" "cc") 4)
;; aa  bb  cc  
;; NIL

Я выучил этот трюк здесь от @Sylwester (большое спасибо!).

...