Sortie conditionnelle
GNU Common Lisp
~v^
La directive up-and-out~^
est le plus souvent utilisée dans une opération de formatage de liste pour se terminer après le dernier élément de liste. Cependant, il peut également être utilisé avec un v
modificateur pour consommer un argument, auquel cas il se termine si cet argument est nul. Ceci est particulièrement utile pour traiter le zéro produit par 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)
Le premier argument de format
peut être l'un t
, nil
alias ()
, ou un flux. S'il est passé t
, il sortira vers stdout
, s'il nil
retournera la sortie formatée sous forme de chaîne. Cela peut être utilisé de manière conditionnelle. L'exemple ci-dessus pourrait être aussi court que:
(dotimes(n 11)(format(> n 0)"~d~%"n))
Si une valeur a été sortie, la valeur de retour sera nil
. Pour cette raison, il peut également être utilisé comme condition de fin pour une do
boucle:
(do((n 11))((<(decf n)1))(format t"~d~%"n))
(do((n 11))((format(>(decf n)0)"~d~%"n)))
~[...~]
Le formateur conditionnel consomme un argument et sélectionne une chaîne de formatage dans une liste par index. Un cas d'utilisation courant est avec le formateur par défaut ~:;
pour sélectionner entre zéro et non zéro.
(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))
Les formateurs conditionnels peuvent également être imbriqués, auquel cas chacun consommera un argument à son tour.
~&
Dans chacun des exemples ci-dessus, ~%
est utilisé pour émettre une nouvelle ligne. Dans la plupart des cas, cela pourrait être remplacé par une nouvelle ligne littérale. Une autre option consiste à utiliser ~&
, qui émettra une nouvelle ligne si et seulement si le curseur de sortie n'est pas au début d'une ligne, alias a fresh-line
.
Les deux ~%
et ~&
peuvent également prendre un argument, avec unv
modificateur ou une constante, et produiront autant de nouvelles lignes. Ils accepteront également tous les deux avec plaisir un argument négatif, auquel cas ils n'émettent rien.
Références externes
Common Common Lisp
18. Quelques recettes FORMAT
Common Lisp the Language, 2e édition
22.3.3. Sortie formatée en flux de caractères