Skip to content

Recettes de cuisines avec format en Common Lisp

FORMAT est une fonction tout à fait exceptionnelle et vraiment propre à Common Lisp. La fonction C la plus proche de FORMAT serait FPRINTF, mais cette dernière ne tient pas la route face aux possibilités, la souplesse et la richesse de FORMAT.

FORMAT sert à formater et à imprimer une chaine de caractère, il prend au moins deux arguments, le descripteur de fichier (ou T pour la sortie standard ou NIL pour retourner la chaine formatée.

Avant tout, FORMAT sait afficher n’importe quoi avec une seule directive. Que la variable soit un nombre, une chaine de caractère, une liste (ça marche aussi avec les vecteurs, les caractères, presque tout en fait), il suffit d’utiliser la directive ~A et format s’adaptera au mieux.

CL-USER> (format t "~A ~A ~A~%" 1 "hop" '(1 2 3))
1 hop (1 2 3)

FORMAT sait également formater des listes:

CL-USER> (format t "~{~A ==> ~}~%" '(1 2 3 4))
1 ==> 2 ==> 3 ==> 4 ==>

~% permet de formater des chiffres décimaux, en rajoutant un préfix on décide du nombre de chiffres après la virgule.

CL-USER> (format t "~$ = ~5$~%" pi pi)
3.14 = 3.14159

Le prefix peut même être remplacé par une variable en utilisant le v

CL-USER> (format t "~v$" 14 pi)
3.14159265358979

~F permet également de formater des décimaux, il prend deux arguments, un pour la taille du nombre et un pour le nombre de chiffres après la virgule, on utilise le premier argument en préfix, mais si on veut utiliser le second, il faut le précéder d’une virgule qui indique à FORMAT d’ignorer le premier argument.

CL-USER> (format t "~5F" pi)
3.142
NIL
CL-USER> (format t "~,5F" pi)
3.14159
NIL

~d permet d’afficher des nombres entiers, il prend également des préfix:

CL-USER> (format t "~d ~:d ~@d ~:@d" 1000000 1000000 1000000 1000000)
1000000 1,000,000 +1000000 +1,000,000

~% et ~& affichent tout deux un retour à la ligne, ~% dans tous les cas et ~& seulement lorsque la ligne n’est pas vide.

~C permet d’afficher un caractère. Cette directive ne sert à rien puisqu’elle a exactement le même fonctionnement que ~A, sauf si on lui rajoute un préfix, alors elle affiche le nom du caractère (très utile pour les caractères non imprimables.

CL-USER> (format t "-~A-~:C~%" #\space #\space)
- -Space

~r permet d’afficher des chiffres en anglais, ou en Romain avec son préfix

(format t "~r ~@r~%" 1234 1234)
one thousand two hundred thirty-four MCCXXXIV

~p affiche un s si la variable qui lui correspond n’est pas un 1. Avec son préfix ~:p, il fait la même chose avec “y” ou “ies”. La variable utilisée est celle qui a servi à la précédente directive.

CL-USER> (format t "~r famil~:@p, ~r famil~:@p~%" 1 2)
one family, two families