Formato (Lisp común)
Formato es una función en Common Lisp que puede producir texto formateado usando una cadena de formato similar a la cadena de formato printf. Proporciona más funcionalidad que printf
, lo que permite al usuario generar números en varios formatos (incluidos, por ejemplo: hexadecimal, binario, octal, números romanos e inglés), aplicar ciertos especificadores de formato solo bajo ciertas condiciones. , iterar sobre estructuras de datos, generar datos tabularmente e incluso recurrir, llamando a format
internamente para manejar estructuras de datos que incluyen sus propias cadenas de formato preferidas. Esto se origina funcionalmente en Lisp Machine Lisp del MIT, donde se basó en Multics ioa_
.
Especificación
La función format
está especificada por la sintaxis
formato destino controlString > > formatoArgumentos
Las directivas de la cadena de control se interpolan utilizando los argumentos de formato, y la secuencia de caracteres así construida está escrita al destino.
Destino
El destino puede ser una secuencia, una cadena dinámica, T
o la constante NIL
; el último de los cuales presenta un caso especial en el sentido de que crea, formatea y devuelve un nuevo objeto de cadena, mientras que T
se refiere a la salida estándar, que suele ser equivalente a la consola. Los flujos en Common Lisp comprenden, entre otros, salidas de cadenas y flujos de archivos; por lo tanto, al ser capaz de escribir en tal variedad de destinos, esta función unifica capacidades distribuidas entre distintos comandos en algunos otros lenguajes de programación, como printf
de C para salida de consola, sprintf
para formatear cadenas y fprintf
para escribir archivos.
La multitud de tipos de destino se ejemplifica a continuación:
;; Imprime "1 + 2 = 3" a la salida estándar y devuelve ``NIL'.()formato T "1 + 2 = ~d" 3);; Crea y devuelve una nueva cadena que contiene "1 + 2 = 3".()formato NIL "1 + 2 = ~d" 3);; Crea y devuelve una nueva cadena que contiene "1 + 2 = 3".()con salida a la cadena ()Producto) ()formato Producto "1 + 2 = ~d" 3);; escribe al archivo "outputFile.txt" la cadena "1 + 2 = 3".()con-open-file ()Producto "outputFile.txt" :direction :output Si no existe :crear :si-existe :append) ()formato Producto "1 + 2 = ~d" 3);; Apende a la cadena dinámica la cadena "1 + 2 = 3".()Deja (()de producción ()make-array 0 :element-type 'character :Ajustable T :Punto de relleno 0)) ()Declara ()Tipo cuerda de producción) ()formato de producción "1 + 2 = ~d" 3) ()el cuerda de producción)
Cadena de control y formato de argumentos
La cadena de control puede contener caracteres literales, así como el metacarácter ~
(tilde), que delimita las directivas de formato. Mientras que los literales en la entrada se repiten palabra por palabra, las directivas producen una salida especial, que a menudo consume uno o más argumentos de formato.
Directivas
Una directiva de formato, introducida por un ~
, va seguida de cero o más parámetros de prefijo, cero o más modificadores y el tipo de directiva. Por lo tanto, una definición directiva debe ajustarse al patrón
~prefijoParameters[ ]modificadores]Directiva Tipo
El tipo de directiva siempre se especifica mediante un solo carácter, sin distinguir entre mayúsculas y minúsculas en el caso de letras. Los datos que una directiva de formato debe procesar, si son necesarios, se denominan argumento de formato y pueden ser cero o más objetos de cualquier tipo compatibles. Si se aceptan dichos datos y en qué cantidad depende de la directiva y de los posibles modificadores que se le apliquen. El tipo de directiva ~%
, por ejemplo, se abstiene del consumo de cualquier argumento de formato, mientras que ~d
espera que se imprima exactamente un número entero, y ~@{
, una directiva influenciada por el modificador de signo, procesa todos los argumentos restantes.
La siguiente directiva, ~b
, espera un objeto numérico de los argumentos de formato y escribe su equivalente binario (base 2) en la salida estándar.
()formato T "B" 5)
Cuando las configuraciones son permisivas, se pueden especificar parámetros de prefijo.
Parámetros de prefijo
Los parámetros de prefijo permiten una inyección de información adicional en una directiva para operar, similar a la operación de parámetros cuando se proporcionan a una función. Los parámetros de prefijo son siempre opcionales y, si se proporcionan, deben ubicarse entre el ~
de introducción y los modificadores o, si no hay ninguno presente, el tipo de directiva. Los valores están separados por comas, pero no toleran espacios en blanco a ambos lados. El número y tipo de estos parámetros depende de la directiva y de la influencia de posibles modificadores.
Se pueden utilizar dos caracteres particulares como valores de parámetros de prefijo con interpretación distintiva: v
o V
actúa como marcador de posición para un número entero o carácter de los argumentos de formato que se consumido y colocado en su lugar. El segundo carácter especial, #
, se sustituye por el recuento de argumentos de formato respetando su consumo. Tanto v
como #
habilitan el comportamiento definido por el contenido dinámico inyectado en la lista de parámetros de prefijo.
El valor del parámetro v
introduce una funcionalidad equivalente a una variable en el contexto de la programación general. Dado este escenario simple, para rellenar a la izquierda una representación binaria del número entero 5
hasta al menos ocho dígitos con ceros, la solución literal es la siguiente:
()formato T "~8,'0b" 5)
Sin embargo, el primer parámetro de prefijo que controla el ancho de salida puede definirse en términos del carácter v
, delegando la especificación del valor del parámetro al siguiente argumento de formato, en nuestro caso 8.
()formato T "v,'0b" 8 5)
Las soluciones de este tipo son particularmente beneficiosas si partes de la lista de parámetros de prefijo se describen mediante variables o argumentos de función en lugar de literales, como es el caso en el siguiente código:
()Deja (()Número de dígitos 8) ()Declara ()Tipo ()entero 0 *) Número de dígitos) ()formato T "v,'0b" Número de dígitos 5)
Aún más apropiado en aquellas situaciones que involucran entrada externa, se puede pasar un argumento de función a la directiva de formato:
()defun print-as-hexadecimal ()número a formato Número de dígitos) "Imprime el NUMBER-TO-FORMAT en el sistema hexadecimal (radix 16), con ceros a al menos NUMBER-OF-DIGITS". ()Declara ()Tipo Número número a formato) ()Declara ()Tipo ()entero 0 *) Número de dígitos) ()formato T "V, '0x" Número de dígitos número a formato)()print-as-hexadecimal 12 2)
#
como parámetro de prefijo cuenta los argumentos de formato que aún no han sido procesados por las directivas anteriores, y lo hace sin consumir nada de esta lista. La utilidad de un valor insertado dinámicamente está preponderantemente restringida a casos de uso relacionados con el procesamiento condicional. Como el argumento número sólo puede ser un número entero mayor o igual a cero, su significado coincide con el de un índice en las cláusulas de una directiva ~[
condicional.
La interacción del valor del parámetro de prefijo especial #
con la directiva de selección condicional ~[
se ilustra en el siguiente ejemplo. La condición establece cuatro cláusulas, accesibles a través de los índices 0, 1, 2 y 3 respectivamente. El número de argumentos de formato se emplea como medio para la recuperación del índice de cláusulas; para hacerlo, insertamos #
en la directiva condicional que permite que el índice sea un parámetro de prefijo. #
calcula el recuento de argumentos de formato y sugiere este número como índice de selección. Los argumentos, no consumidos por este acto, están disponibles y procesados por las directivas de la cláusula seleccionada.
;; Impresos "ninguno seleccionado".()formato T "~#[none selected~~;one selected: ~a~;two selected: ~a and ~a~:;more selected: ~@{~a~^, ~}~); Imprimir "uno seleccionado: BUNNY".()formato T "~#[none selected~~;one selected: ~a~;two selected: ~a and ~a~:;more selected: ~@{~a~^, ~}~ Conejo); Imprimir "dos seleccionados: BUNNY y PIGEON".()formato T "~#[none selected~~;one selected: ~a~;two selected: ~a and ~a~:;more selected: ~@{~a~^, ~}~ Conejo 'pigeon);; Impresos "más seleccionados: BUNNY, PIGEON, MOUSE".()formato T "~#[none selected~~;one selected: ~a~;two selected: ~a and ~a~:;more selected: ~@{~a~^, ~}~ Conejo 'pigeon 'mouse')
Modificadores
Los modificadores actúan en calidad de banderas que intentan influir en el comportamiento de una directiva. La admisión, la magnitud de la modificación del comportamiento y el efecto, al igual que con los parámetros de prefijo, dependen de la directiva. En algunos casos graves, la sintaxis de una directiva puede variar hasta el punto de invalidar ciertos parámetros de prefijo; este poder distingue especialmente a los modificadores de la mayoría de los parámetros. Los dos caracteres modificadores válidos son @
(arroba) y :
(dos puntos), posiblemente en combinación como :@
o . @:
.
El siguiente ejemplo ilustra un caso bastante leve de influencia ejercida sobre una directiva por el modificador @
: simplemente garantiza que la representación binaria de un número formateado siempre esté precedida por la firmar:
()formato T "~@b" 5)
Directrices de formato
A continuación se incluye una enumeración de las directivas de formato, incluida su sintaxis completa y sus efectos modificadores.
Cara Descripción ~ Imprime el literal ~ carácter. Forma completa:
~repetitions~
.No modifier: Prints
repetitions
tiempos~
carácter.:
Modificador: Inválido.@
Modificador: Inválido.:@
Modificador: Inválido.c, C Imprimen un solo personaje. Forma completa:
~c
.No modifier: Imprime el carácter del argumento formato sin prefijo.
:
modificador: Difunde caracteres no impresos.@
modificador: Prepende el legible#
Prefijo.:@
modificador: Difunde caracteres no impresos y menciona las teclas de cambio.% Imprimen una nueva línea incondicional. Forma completa:
~repetitions%
.No modifier: Prints
repetitions
rupturas de línea.:
Modificador: Inválido.@
Modificador: Inválido.:@
Modificador: Inválido." Imprime una nueva línea condicional, o nueva línea. Forma completa:
~repetitions&
.No modifier: Si el destino no está al principio de una línea fresca, imprimir
repetitions
rupturas de línea; de lo contrario, impresionesrepetitions
- 1 línea.:
Modificador: Inválido.@
Modificador: Inválido.:@
Modificador: Inválido.Silencio Imprimen un separador de página. Forma completa:
~repetitions|
.No modifier: Prints
repetitions
veces un separador de página.:
Modificador: Inválido.@
Modificador: Inválido.:@
Modificador: Inválido.r, R O imprime el número en la base especificada (radix) o lo deletrea. Forma completa:
~radix,minColumns,padChar,commaChar,commaIntervalR
.Con parámetros de prefijo, imprime el argumento en el radio (base).
Sin parámetros de prefijo, el argumento de formato es eliminado, ya sea en letras inglesas o en números romanos.
No modifier: Imprime el argumento como un número de inglés.
:
modificador: Habla el argumento en números ordinal inglés.@
modificador: Imprime el argumento en números romanos usando el formato romano habitual (por ejemplo, 4 = IV).:@
modificador: Imprime el argumento en números romanos usando el formato romano antiguo (por ejemplo, 4 = IIII).d, D Imprime el argumento en el radio decimal (base = 10). Forma completa:
~minColumns,padChar,commaChar,commaIntervald
.No modifier: Impresos como número decimal sin
+
(plus) señal o separador de grupo.:
modificador: Usa comas como separador de grupo.@
modificador: Prepende la señal.:@
modificador: Prepende el signo y utiliza comas como separador de grupo.b, B Imprime el argumento en el radio binario (base = 2). Forma completa:
~minColumns,padChar,commaChar,commaIntervalb
.No modificador: Impresos como número binario sin
+
(plus) señal o separador de grupo.:
modificador: Usa comas como separador de grupo.@
modificador: Prepende la señal.:@
modificador: Prepende el signo y utiliza comas como separador de grupo.o, O Imprime el argumento en el radio octal (base = 8). Forma completa:
~minColumns,padChar,commaChar,commaIntervalo
.No modificador: Impresos como número de octal sin
+
(plus) señal o separador de grupo.:
modificador: Usa comas como separador de grupo.@
modificador: Prepende la señal.:@
modificador: Prepende el signo y utiliza comas como separador de grupo.x, X Imprime el argumento en el radio hexadecimal (base = 16). Forma completa:
~minColumns,padChar,commaChar,commaIntervalx
.No modifier: Impresos como número hexadecimal sin
+
(plus) señal o separador de grupo.:
modificador: Usa comas como separador de grupo.@
modificador: Prepende la señal.:@
modificador: Prepende el signo y utiliza comas como separador de grupo.f, F Imprime el argumento como un flotador en notación de punto fijo. Forma completa:
~width,numDecimalPlaces,scaleFactor,overflowChar,padCharf
.No modifier: Impresos como punto fijo sin
+
(plus) señal.:
Modificador: Inválido.@
modificador: Prepende la señal.:@
Modificador: Inválido.e, E Imprime el argumento como un flotador en notación exponencial. Forma completa:
~width,numDecimalPlaces,numDigits,scaleFactor,overflowChar,padChar,exponentChare
.No modifier: Impresos como exponencial sin
+
(plus) señal.:
Modificador: Inválido.@
modificador: Prepende la señal.:@
Modificador: Inválido.g, G Imprime el argumento ya sea como flotador en punto fijo o notación exponencial, eligiendo automáticamente. Forma completa:
~width,numDecimalPlaces,numDigits,scaleFactor,overflowChar,padChar,exponentCharg
.No modifier: Impresos como punto fijo o exponencial sin
+
(plus) señal.:
Modificador: Inválido.@
modificador: Prepende la señal.:@
Modificador: Inválido.$ Imprime el argumento según las convenciones monetarias. Forma completa:
~width,numDigits,minWholeDigits,minTotalWidth,padChar$
.No modificador: Impresos en convenios monetarios sin
+
(plus) firma o relleno.:
modificador: Prepende el letrero antes de padding caracteres.@
modificador: Prepende la señal.:@
Modificador: Inválido.a, A Imprimen el argumento de una manera humana. Forma completa:
~minColumns,colInc,minPad,padChara
.Sin modificador: Impresta la salida humana sin justificación.
:
modificador: ImpresosNIL
como lista vacía()
en lugar deNIL
.@
modificador: Pads a la izquierda en lugar del lado derecho.:@
modificador: Pads a la izquierda e impresionesNIL
como()
.s, S Imprime el argumento de una manera compatible con el read
función.Forma completa:
~minColumns,colInc,minPad,padChars
.No modifier: Prints
read
-compatible sin justificación.:
modificador: ImpresosNIL
como lista vacía()
en lugar deNIL
.@
modificador: Pads a la izquierda en lugar del lado derecho.:@
modificador: Pads a la izquierda e impresionesNIL
como()
.w, W Imprime el argumento de acuerdo con las variables de control de la impresora. Forma completa:
~w
.No modifier: Impresos de acuerdo con las variables de control actualmente establecidas.
:
modificador: Permite bastante impresión.@
modificador: Ignora el nivel de impresión y las restricciones de longitud.:@
modificador: Ignora el nivel de impresión y las restricciones de longitud y permite una impresión bonita.¿Qué? Imprime un descanso de línea de acuerdo con las bonitas reglas de la impresora. Forma completa:
~_
.No modifier: Imprime un descanso de línea si se supera una sola línea.
:
modificador: Imprimen una ruptura de línea si ninguna línea precedió.@
modificador: Usa un compacto (Miser) estilo.:@
modificador: Siempre inserta un descanso de línea.c) Justifica la salida. Forma completa:
~minColumns,colInc,minPad,padChar<expression~>
.No modificador: Izquierda justifica la salida.
:
modificador: Agrega el relleno izquierdo (=justifica derecho).@
modificador: Agrega el relleno derecho (=justifica la izquierda).:@
modificador: Centro el texto.i, I Indentes un bloque lógico. Forma completa:
~i
.No modificador: Comienza la identificación del primer personaje.
:
modificador: Indents starting from the current output position.@
Modificador: Inválido.:@
Modificador: Inválido./ Difunde la operación de formato a una función definida por el usuario. La función debe aceptar al menos cuatro parámetros: (1) El flujo o cadena ajustable para imprimir a, (2) el argumento formato para procesar, (3) un valor booleano que es T
si:
modificador fue suministrado, y (4) un valor booleano que esT
si@
El modificador fue suministrado. Además, se pueden especificar cero o más argumentos si la función también permite parámetros de prefijo.Forma completa:
~prefixParams/function/
.No modifier: Depende de la implementación de la función.
:
modificador: Depende de la aplicación de la función.@
modificador: Depende de la aplicación de la función.:@
modificador: Depende de la aplicación de la función.t, T Mueva el cursor de salida a una columna dada o a una distancia horizontal. Forma completa:
~columnNumber,columnIncrementt
.No modificador: Se mueve a la columna especificada.
:
modificador: Orientes en la sección.@
modificador: Mueva el cursor relativo a la posición actual.:@
modificador: Orientes relativos a la sección.* Navega a través de los argumentos de formato. Forma completa:
~numberOfArgs*
.No modificador: Omita el
numberOfArgs
argumentos de formato.:
modificador: MoveosnumberOfArgs
atrás.@
modificador: Se mueve al argumento en el índicenumberOfArgs
.:@
Modificador: Inválido.[ Imprime una expresión basada en una condición. Estas expresiones, o cláusulas, están separados por ~;
directiva, y una cláusula por defecto se puede indicar utilizando~:;
como su separador líder. El número de cláusulas permitidas depende de la variedad concreta de esta directiva según lo indicado por su modificador o modificador. Toda la porción condicional debe ser terminada con una~]
.Forma completa:
~[clause1~;...~;clauseN~:;defaultClause~]
.Existe una forma alternativa, válida sólo sin modificadores, que reubica el índice de la cláusula para seleccionar,
selectionIndex
, desde los argumentos de formato a un parámetro prefijo:Forma completa:
~selectionIndex[clause1~;...~;clauseN~:;defaultClause~]
.Esta sintaxis se felicita especialmente en conjunto con el carácter especial del parámetro prefijo
#
que equipara el elemento seleccionado con el número de argumentos de formato dejados para procesar. Una directiva de este tipo permite un modelado muy conciso de múltiples selecciones.No modifier: El argumento formato debe ser un índice de entero basado en cero, su valor es el de la cláusula para seleccionar e imprimir.
:
modificador: Selecciona la primera cláusula si el argumento formato esNIL
De lo contrario, el segundo.@
modificador: Sólo procesa la cláusula si el argumento formato esT
, de lo contrario se salta.:@
Modificador: Inválido.{} Iterates over one or more format arguments and prints these. La porción iterativa debe cerrarse con una ~}
directiva. Si la directiva~^
se encuentra dentro de la porción adjunta, cualquier contenido después de que se consume sólo si el elemento actual no es el último en la lista procesada. Si el parámetro prefijonumberOfRepetitions
se especifica, su valor define el número máximo de elementos a procesar; de lo contrario todos estos se consumen.Forma completa:
~numberOfRepetitions{expression~}
.No modifier: Se espera que un solo argumento formato sea una lista, sus elementos se consumen en orden por las directivas adjuntas.
:
modificador: Espera que el argumento formato sea una lista de listas, consumiendo sus sublistas.@
modificador: Regards all remaining format arguments as a list and consumes these.:@
modificador: Regards all remaining format arguments as a list of sublists, consuming these sublists.? Sustituye la directiva por el siguiente argumento, que se espera sea un argumento de formato, utilizando los argumentos de formato subsiguientes en la nueva porción. Forma completa:
~?
.No modifier: Se espera que el argumento formato posterior sea una lista cuyos elementos están asociados con la cadena de control insertada.
:
Modificador: Inválido.@
modificador: Espera argumentos de formato separados en lugar de una lista de estos para la parte insertada, como se especificaría de la manera habitual.:@
Modificador: Inválido.() Modifica el caso de la cadena cerrada. Forma completa:
~(expression~)
.No modifier: Convierte todos los caracteres en caso inferior.
:
modificador: Capitaliza todas las palabras.@
modificador: Capitaliza la primera palabra sólo, convierte el resto en caso inferior.:@
modificador: Convierte todos los caracteres en mayúscula.p, P Imprime un sufijo singular o plural dependiendo del argumento de formato numérico. Forma completa:
~p
.No modificador: No imprime nada si el argumento es igual a 1, de lo contrario se imprime
s
.:
modificador: Regresa al último argumento de formato consumido, imprimiendo nada si fuera 1, de lo contrario imprimiendos
.@
modificador: Imprime uny
si el argumento es igual a 1, de lo contrario imprimiries
.:@
modificador: Vuelve al último argumento de formato consumido, impresióny
si fuera 1 otra impresiónies
.^ Utilizado en una directiva de iteración ~{...~}
para terminar el procesamiento del contenido adjunto si no siguen otros argumentos de formato.Forma completa:
~p1,p2,p3^
.La condición de terminación depende del número de parámetros de prefijo suministrados:
- Si no se especifica ningún parámetro prefijo, la directiva cesa si los argumentos cero permanecen en proceso.
- Si un parámetro prefijo
p1
se especifica, la directiva cesa sip1
resuelve a cero. - Si dos parámetros de prefijo
p1
yp2
se especifica, la directiva cesa sip1
igualesp2
. - Si tres parámetros de prefijo
p1
,p2
yp3
se especifica, la directiva cesa si sostiene:p1
≤p2
≤p3
.
No modifier: Funciona como se describe.
:
Modificador: Inválido.@
Modificador: Inválido.:@
Modificador: Inválido.Newline Saltar o retener las roturas de línea y espacios blancos adyacentes en una cadena de control multilínea. Forma completa:
~Newline
.No modifier: Saltar la ruptura de línea inmediatamente siguiente y espacios blancos adyacentes.
:
modificador: Saltar la ruptura de línea inmediatamente después, pero conserva espacios blancos adyacentes.@
modificador: Retiene la ruptura de línea inmediatamente después, pero salta espacios blancos adyacentes.:@
Modificador: Inválido.
Ejemplo
Un ejemplo de C printf
La llamada es la siguiente:
printf()"Color %s, número1 %d, número2 %05d, hex %x, flotador %5.2f, valor sin asignar %u.n", "rojo", 123456, 89, 255, 3.14, 250);
Utilizando Common Lisp, esto equivale a:
()formato t "Color ~A, number1 ~D, number2 ~5,'0D, hex ~X, flota ~5,2F, unsigned value ~D.~%" "rojo" 123456 89 255 3.14 250) ;; impresiones: Color rojo, número1 123456, número2 00089, hex FF, flotar 3.14, valor sin firmar 250.
Otro ejemplo sería imprimir cada elemento de la lista delimitado por comas, lo que se puede hacer usando ~{, ~^ y ~}:
()Deja (()comestibles '()huevos pan mantequilla zanahorias)) ()formato t "... comestibles) ; Impresos en mayúscula ()formato t "... comestibles) ; Capitaliza la producción ;; impresiones: EGGS, BREAD, BUTTER, CARROTS. ;; impresiones: Huevos, pan, mantequilla, carros.
Tenga en cuenta que no sólo es la lista de valores iterados directamente por format
, pero las comas correctamente se imprimen entre artículos, no después ellos. Un ejemplo aún más complejo sería imprimir una lista usando la frase inglesa consuetudinaria:
()Deja (()plantilla "Los ganadores afortunados fueron: ~# [Ninguno]; ~S~; ~S and ~S~ ~;~@{~#[~; and~] - Sí.) ()formato Nil plantilla) ; ⇒ "Los ganadores afortunados fueron: ninguno." ()formato Nil plantilla 'foo) ; ⇒ "Los ganadores afortunados fueron: FOO." ()formato Nil plantilla 'foo 'bar) ; ⇒ "Los afortunados ganadores fueron: FOO y BAR." ()formato Nil plantilla 'foo 'bar 'baz) ; ⇒ "Los afortunados ganadores fueron: FOO, BAR y BAZ." ()formato Nil plantilla 'foo 'bar 'baz 'quux) ; ⇒ "Los afortunados ganadores fueron: FOO, BAR, BAZ y QUUX." )
La capacidad de definir una nueva directiva a través de ~/functionName/
proporciona los medios para la personalización. El siguiente ejemplo implementa una función que imprime una cadena de entrada en minúsculas, mayúsculas o estilo inverso, permitiendo también una configuración del número de repeticiones.
()defun mydirective ()destino formato-argumento colon-modificador-supplied-p a-sign-modificador-supplied-p " Opcional " ()repeticiones 1) "Esta función representa un callback adecuado como directiva en un "formato" invocación, esperando una cuerda como su FORMAT-ARGUMENT para imprimir REPETITIONS número de veces a la DESTINACIÓN. -... Las banderas COLON-MODIFIER-SUPPLIED-P y AT-SIGN-MODIFIER-SUPPLIED-P esperar un Boolean generalizado cada uno, siendo los representantes de los Modificadores ``:'' y ``@' respectivamente. Su influencia se define como sigue: - Si no se establece ningún modificador, el FORMAT-ARGUMENT se imprime sin nuevas modificaciones. - Si el modificador de colon se establece, pero no el modificador de la señal, el FORMAT-ARGUMENT se convierte en minúscula antes de imprimir. - Si el modificador está establecido, pero no el colonmodificador, el FORMAT-ARGUMENT se convierte en mayúscula antes de imprimir. - Si ambos modificadores están establecidos, el FORMAT-ARGUMENT se revierte antes Impresión. -... El número de veces que se imprime la cadena FORMAT-ARGUMENT determinado por el parámetro prefijo REPETITIONS, que debe ser un número entero no negativo y predeterminado a uno." ()Declara ()Tipo ()o nulo ()eql T) streaming cuerda) destino) ()Declara ()Tipo T formato-argumento) ()Declara ()Tipo T colon-modificador-supplied-p) ()Declara ()Tipo T a-sign-modificador-supplied-p) ()Declara ()Tipo ()entero 0 *) repeticiones) ()Deja (()cadena a impresión formato-argumento) ()Declara ()Tipo cuerda cadena a impresión) ; Ajuste la STRING-TO-PRINT basada en los modificadores. ()cond (()y colon-modificador-supplied-p a-sign-modificador-supplied-p) ()setf cadena a impresión ()inversión cadena a impresión)) ()colon-modificador-supplied-p ()setf cadena a impresión ()maleta de cadena cadena a impresión)) ()a-sign-modificador-supplied-p ()setf cadena a impresión ()maleta de cuerda cadena a impresión)) ()T NIL) ()bucle repetición repeticiones do ()formato destino "~a" cadena a impresión))); Imprimir "Hola" una sola vez.()formato T "~/mydirective/" "Hola"); Imprimir "Hola" tres veces.()formato T "~3/mydirective/" "Hola");; Imprimir una maleta inferior "Hola" (= "hola") tres veces.()formato T "~3:/mydirective/" "Hola");; Imprimir una maleta superior "Hola" (= "HELLO") tres veces.()formato T "~3@/mydirective/" "Hola");; Imprimir un "Hola" revertido (= "olleH") tres veces.()formato T "~3:@/mydirective/" "Hola")
Si bien format
es algo infame por su tendencia a volverse opaco y difícil de leer, proporciona una sintaxis notablemente concisa pero poderosa para una necesidad común y especializada.
Hay disponible una tabla de resumen FORMATO de Common Lisp.
Libros
- Common Lisp HyperSpec Sección 22.3
- Capítulo de Lisp Común 18. Un poco de formación Recetas
Contenido relacionado
Spl (Unix)
PERLA (lenguaje de programación)
Lógica de primer orden
Red semántica
Gramática libre de contexto