Saída Condicional
Lisp Comum GNU
~v^
A diretiva up-and-out~^
é mais comumente usada em uma operação de formatação de lista para terminar após o último item da lista. No entanto, também pode ser usado com um v
modificador para consumir um argumento, caso em que termina se esse argumento for zero. Isso é particularmente útil para lidar com o zero produzido por 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)
O primeiro argumento para format
pode ser um dos t
, nil
também conhecido como ()
, ou um fluxo. Se passado t
, ele produzirá para stdout
, se nil
ele retornará a saída formatada como uma sequência. Isso pode ser usado como saída condicional. O exemplo acima pode ser escrito igualmente tão curto quanto:
(dotimes(n 11)(format(> n 0)"~d~%"n))
Se um valor foi emitido, o valor de retorno será nil
. Por esse motivo, também pode ser usado como condição de término para um do
loop:
(do((n 11))((<(decf n)1))(format t"~d~%"n))
(do((n 11))((format(>(decf n)0)"~d~%"n)))
~[...~]
O formatador condicional consome um argumento e seleciona uma sequência de formatação de uma lista por índice. Um caso de uso comum é com o formatador padrão ~:;
para selecionar entre zero e não zero.
(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))
Os formatadores condicionais também podem ser aninhados; nesse caso, cada um deles consumirá um argumento por sua vez.
~&
Em cada um dos exemplos acima, ~%
é usado para emitir uma nova linha. Na maioria dos casos, isso pode ser substituído por uma nova linha literal. Outra opção é usar ~&
, que emitirá uma nova linha se e somente se o cursor de saída não estiver no início de uma linha, também conhecido como a fresh-line
.
Ambos ~%
e ~&
também podem aceitar um argumento, com um v
modificador ou como uma constante, e produzirão tantas novas linhas. Os dois também aceitarão com satisfação um argumento negativo, caso em que não emitem nada.
Referências externas
Lisp Prático Comum
18. Algumas Receitas de FORMATO
Common Lisp the Language, 2ª Edição
22.3.3. Saída formatada para fluxos de caracteres