Wyjście warunkowe
GNU Common Lisp
~v^
Dyrektywa zwiększania i wyłączania ~^
jest najczęściej używana w operacji formatowania listy w celu zakończenia jej po ostatnim elemencie listy. Można go jednak również użyć z v
modyfikatorem do zużywania argumentu, w którym to przypadku kończy się, jeśli argument ten wynosi zero. Jest to szczególnie przydatne w przypadku zera wytwarzanego przez 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)
Pierwszym argumentem format
może być jeden t
, nil
aka ()
, lub strumienia. Jeśli zostanie przekazany t
, wyśle go do stdout
, jeśli nil
zwróci sformatowane wyjście jako ciąg. Można to wykorzystać warunkowo. Powyższy przykład można napisać równie krótko, jak:
(dotimes(n 11)(format(> n 0)"~d~%"n))
Jeśli wyprowadzono wartość, zwracana będzie wartość nil
. Z tego powodu może być również używany jako warunek zakończenia do
pętli:
(do((n 11))((<(decf n)1))(format t"~d~%"n))
(do((n 11))((format(>(decf n)0)"~d~%"n)))
~[...~]
Formater warunkowy zużywa argument i wybiera ciąg formatujący z listy według indeksu. Częstym przypadkiem użycia jest domyślny formatyzator, ~:;
który wybiera pomiędzy zero a zero.
(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))
Można również zagnieżdżać formatory warunkowe, w którym to przypadku każdy z nich zużyje argument.
~&
W każdym z powyższych przykładów ~%
zastosowano znak nowej linii. W większości przypadków można to zastąpić dosłownie nową linią. Inną opcją jest użycie ~&
, która wyemituje nowy wiersz wtedy i tylko wtedy, gdy kursor wyjściowy nie znajduje się na początku linii, czyli a fresh-line
.
Oba ~%
i ~&
mogą również przyjmować argument, z v
modyfikatorem lub jako stałą, i wygenerują tyle nowych linii. Oboje również chętnie zaakceptują argument negatywny, w którym to przypadku nic nie emitują.
Referencje zewnętrzne
Praktyczne wspólne Lisp
18. Kilka przepisów na formaty
Common Lisp the Language, wydanie drugie
22.3.3. Sformatowane wyjście do strumieni znaków