Uscita condizionale
GNU Common Lisp
~v^
La direttiva up-and-out~^
viene utilizzata più comunemente in un'operazione di formattazione dell'elenco per terminare dopo l'ultimo elemento dell'elenco. Tuttavia, può anche essere utilizzato con un v
modificatore per utilizzare un argomento, nel qual caso termina se tale argomento è zero. Ciò è particolarmente utile per gestire lo zero prodotto da 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)
Il primo argomento format
può essere uno di t
, nil
aka ()
, o uno stream. Se passato t
, verrà generato in stdout
, se nil
restituirà l'output formattato come stringa. Questo può essere usato in modo condizionale. L'esempio sopra potrebbe essere scritto ugualmente breve come:
(dotimes(n 11)(format(> n 0)"~d~%"n))
Se è stato emesso un valore, il valore restituito sarà nil
. Per questo motivo, può anche essere utilizzato come condizione di terminazione per un do
ciclo:
(do((n 11))((<(decf n)1))(format t"~d~%"n))
(do((n 11))((format(>(decf n)0)"~d~%"n)))
~[...~]
Il formattatore condizionale utilizza un argomento e seleziona una stringa di formattazione da un elenco per indice. Un caso d'uso comune è con il formattatore predefinito ~:;
per selezionare tra zero e non zero.
(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))
I formattatori condizionali possono anche essere nidificati, nel qual caso ciascuno consumerà a sua volta un argomento.
~&
In ciascuno degli esempi sopra, ~%
viene utilizzato per emettere una nuova riga. Nella maggior parte dei casi, questo potrebbe essere sostituito da una nuova riga letterale. Un'altra opzione è utilizzare ~&
, che emetterà una nuova riga se e solo se il cursore di output non si trova all'inizio di una riga, ovvero a fresh-line
.
Entrambi ~%
e ~&
possono anche prendere un argomento, con un v
modificatore o come costante, e produrranno tante nuove righe. Accetteranno entrambi felicemente un argomento negativo, nel qual caso non emettono nulla.
Riferimenti esterni
Pratico Lisp comune
18. Alcune ricette di FORMATO
Common Lisp the Language, 2nd Edition
22.3.3. Output formattato in flussi di caratteri