Условный вывод
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, nilaka ()или поток. Если он пройден 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. Форматированный вывод в символьные потоки