Условный вывод
GNU Common Lisp
~v^
Вверх и из директивы ~^
наиболее часто используется в списке операции форматирования прекратить после последнего элемента списка. Однако его также можно использовать с v
модификатором для получения аргумента, и в этом случае он завершается, если этот аргумент равен нулю. Это особенно полезно для борьбы с нулем, создаваемым dotimes
.
(loop as n from 1 to 10 do(format t"~d~%"n))
(dotimes(n 11)(if(> n 0)(format t"~d~%"n)))
(dotimes(n 11)(format t"~v^~d~%"n n))
format(condition)
Первым аргументом format
может быть один t
, nil
aka ()
или поток. Если он пройден t
, он будет выводить в stdout
, если nil
он вернет форматированный вывод в виде строки. Это можно использовать условно на выходе. Приведенный выше пример можно записать так же коротко, как:
(dotimes(n 11)(format(> n 0)"~d~%"n))
Если значение было выведено, возвращаемое значение будет nil
. Из-за этого его также можно использовать как условие завершения do
цикла:
(do((n 11))((<(decf n)1))(format t"~d~%"n))
(do((n 11))((format(>(decf n)0)"~d~%"n)))
~[...~]
Условный модуль форматирования использует аргумент и выбирает строку форматирования из списка по индексу. Обычный вариант использования - форматер ~:;
по умолчанию для выбора между нулем и не нулем.
(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))
Условные средства форматирования также могут быть вложенными, и в этом случае каждый из них будет использовать аргумент по очереди.
~&
В каждом из приведенных выше примеров, ~%
используется для выделения новой строки. В большинстве случаев это можно заменить буквальным переводом строки. Другим вариантом является использование ~&
, которое будет испускать новую строку тогда и только тогда, когда выходной курсор находится не в начале строки, иначе a fresh-line
.
И то ~%
и другое ~&
может также принимать аргумент с v
модификатором или в виде константы, и будет производить столько строк перевода. Они также с радостью примут отрицательный аргумент, и в этом случае они ничего не излучают.
Внешние ссылки
Практический Common Lisp
18. Несколько рецептов FORMAT
Common Lisp the Language, 2-е издание
22.3.3. Форматированный вывод в символьные потоки