Pretty-printing (o Prettyprinting ) es la aplicación de cualquiera de varias convenciones de formato estilístico a archivos de texto , como código fuente , marcado y tipos de contenido similares. Estas convenciones de formato pueden implicar adherirse a un estilo de sangría , usar diferentes colores y tipos de letra para resaltar elementos sintácticos del código fuente o ajustar el tamaño para que el contenido sea más fácil de leer y comprender para las personas. Las bonitas impresoras para código fuente a veces se denominan formateadores o embellecedores de código .
La impresión bonita generalmente se refiere a mostrar expresiones matemáticas similares a la forma en que se escribirían profesionalmente . Por ejemplo, en sistemas de álgebra informática como Maxima o Mathematica , el sistema puede escribir una salida como "x ^ 2 + 3 * x"como " ". Algunas calculadoras gráficas , como la serie Casio 9860 , la serie HP-49/50 y HP Prime , TI-84 Plus , TI-89 y TI-Nspire , la TI-83 Plus con PrettyPt [1 ] , o la TI-84 Plus con el mismo complemento o los sistemas operativos habilitados para "MathPrint", pueden realizar impresiones bonitas. Además, varias calculadoras científicas más nuevas están equipadas con pantallas de matriz de puntos capaces de realizar impresiones bonitas. impresión como la serie Casio FX-ES (Natural Display), la serie Sharp EL-W (WriteView), HP SmartCalc 300s, TI-30XB y Numworks .
Muchos programas de formato de texto también pueden componer matemáticas: TeX fue desarrollado específicamente para la composición tipográfica matemática de alta calidad .
La impresión bonita en instancias de lenguaje de marcado generalmente se asocia con la sangría de etiquetas y contenido de cadenas para determinar visualmente la jerarquía y el anidamiento. Aunque las estructuras sintácticas de los lenguajes basados en etiquetas no varían significativamente, la sangría puede variar significativamente debido a cómo se interpreta un lenguaje de marcado o a los datos que describe.
En MathML , los caracteres de espacio en blanco no reflejan datos, significado o sintaxis superiores a los requeridos por la sintaxis XML . En HTML , los espacios en blanco entre etiquetas se consideran texto y se analizan como nodos de texto en el resultado analizado. [2] Si bien la sangría se puede aplicar generosamente a un documento MathML, se debe tener suficiente cuidado adicional al imprimir un documento HTML para garantizar que no se creen o destruyan nodos de texto adicionales en la proximidad general del contenido o de los elementos de etiqueta que reflejan el contenido. Esta diferencia en complejidad no es trivial desde la perspectiva de una operación de impresión bonita automatizada donde no se necesitan reglas especiales ni casos extremos, como en el ejemplo más simple de MathML. El ejemplo HTML puede requerir una serie de algoritmos progresivos interrelacionados para tener en cuenta varios patrones de elementos de etiquetas y contenido que se ajuste a un estilo uniforme y sea consistente en su aplicación en varias instancias, como lo demuestra el componente de aplicación markup.ts [ 3] utilizado para embellezca HTML, XML y tecnologías relacionadas para la herramienta Pretty Diff .
Los programadores suelen utilizar herramientas para formatear el código fuente del lenguaje de programación de una manera particular. El formato adecuado del código hace que sea más fácil de leer y comprender. Los diferentes programadores suelen preferir diferentes estilos de formato, como el uso de sangría de código y espacios en blanco o la colocación de llaves . Un formateador de código o un indentador de código convierte el código fuente de un estilo de formato a otro. Esto es relativamente sencillo debido a la sintaxis inequívoca de los lenguajes de programación. El embellecimiento del código implica analizar el código fuente en estructuras de componentes, como declaraciones de asignación, bloques if , bucles , etc. (ver también flujo de control ) y formatearlos de la manera especificada por el usuario en un archivo de configuración.
Los embellecedores de código existen como aplicaciones independientes e integradas en editores de texto y entornos de desarrollo integrados . Por ejemplo, los diversos modos de lenguaje de Emacs pueden sangrar correctamente bloques de código de manera atractiva. [4]
Un ejemplo temprano de impresión bonita fue el programa "GRINDEF" ( es decir, 'función de molienda') de Bill Gosper ( c. 1967), que utilizaba búsqueda combinatoria con poda para formatear programas LISP . Las primeras versiones operaban en la forma ejecutable (estructura de lista) del programa Lisp y ignoraban los significados especiales de varias funciones. Las versiones posteriores tenían convenciones de lectura especiales para incorporar comentarios no ejecutables y también para preservar macros de lectura en forma no expandida. También permitieron convenciones de sangría especiales para funciones especiales como . [5] [6] El término "grind" se utilizó en algunos círculos de Lisp como sinónimo de impresión bonita. [7]if
Muchos proyectos de código abierto han establecido reglas para el diseño del código. Los más típicos son el formato GNU [8] y el estilo BSD. [9] La mayor diferencia entre los dos es la ubicación de las llaves: en el estilo GNU, las llaves de apertura y cierre están en líneas separadas, con la misma sangría. El estilo BSD coloca una llave de apertura al final de la línea anterior, y las llaves de cierre pueden ir seguidas de else . El tamaño de la sangría y la ubicación de los espacios en blanco también difieren.
El siguiente ejemplo muestra algunas estructuras típicas de C y cómo les dan formato varias reglas de estilo de sangría . Sin ningún formato, se ve así:
int foo ( int k ){ if ( k < 1 || k > 2 ){ printf ( "fuera de rango \n " ); printf ( "esta función requiere un valor de 1 o 2 \n " );} else { printf ( "Cambiar \n " ); cambiar ( k ) { caso 1 : printf ( "1 \n " ); romper ; caso 2 : printf ( "2 \n " ); romper ;}}}
El programa de sangría GNU produce el siguiente resultado cuando se le solicita sangrar de acuerdo con las reglas de GNU :
int foo ( int k ) { if ( k < 1 || k > 2 ) { printf ( "fuera de rango \n " ); printf ( "esta función requiere un valor de 1 o 2 \n " ); } else { printf ( "Cambiando \n " ); cambiar ( k ) { caso 1 : printf ( "1 \n " ); romper ; caso 2 : printf ( "2 \n " ); romper ; } } }
Produce esta salida al formatear según las reglas BSD:
int foo ( int k ) { if ( k < 1 || k > 2 ) { printf ( "fuera de rango \n " ); printf ( "esta función requiere un valor de 1 o 2 \n " ); } else { printf ( "Cambiando \n " ); cambiar ( k ) { caso 1 : printf ( "1 \n " ); romper ; caso 2 : printf ( "2 \n " ); romper ; } } }
Conceptos relacionados
Utilidades