Salida condicional
GNU Common Lisp
~v^
La directiva up-and-out~^
se usa más comúnmente en una operación de formato de lista para terminar después del último elemento de la lista. Sin embargo, también se puede usar con un v
modificador para consumir un argumento, en cuyo caso termina si ese argumento es cero. Esto es particularmente útil para tratar con el cero producido 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)
El primer argumento para format
puede ser uno t
, nil
aka ()
, o una secuencia. Si se pasa t
, saldrá a stdout
, si nil
devolverá la salida formateada como una cadena. Esto se puede usar condicionalmente salida. El ejemplo anterior podría escribirse igualmente tan corto como:
(dotimes(n 11)(format(> n 0)"~d~%"n))
Si se emitió un valor, el valor de retorno será nil
. Debido a esto, también se puede usar como condición de terminación para un do
bucle:
(do((n 11))((<(decf n)1))(format t"~d~%"n))
(do((n 11))((format(>(decf n)0)"~d~%"n)))
~[...~]
El formateador condicional consume un argumento y selecciona una cadena de formato de una lista por índice. Un caso de uso común es con el formateador predeterminado ~:;
para seleccionar entre cero y no cero.
(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))
Los formateadores condicionales también se pueden anidar, en cuyo caso cada uno consumirá un argumento a su vez.
~&
En cada uno de los ejemplos anteriores, ~%
se utiliza para emitir una nueva línea. En la mayoría de los casos, esto podría ser reemplazado por una nueva línea literal. Otra opción es usar ~&
, que emitirá una nueva línea si y solo si el cursor de salida no está al comienzo de una línea, también conocido como a fresh-line
.
Ambos ~%
y ~&
también pueden tomar un argumento, con un v
modificador o como una constante, y producirán tantas líneas nuevas. Ambos también aceptarán felizmente un argumento negativo, en cuyo caso no emitirán nada.
Referencias externas
Práctico Common Lisp
18. Algunas Recetas FORMATO
Common Lisp the Language, 2ª edición
22.3.3. Salida formateada a secuencias de caracteres