En programación informática , un programa de una sola línea originalmente era una entrada de texto a la línea de comandos de un intérprete de comandos del sistema operativo que realizaba alguna función en una sola línea de entrada. En la actualidad, un programa de una sola línea puede ser...
- una expresión escrita en el lenguaje de la concha;
- la invocación de un intérprete junto con el código fuente del programa para que el intérprete lo ejecute;
- la invocación de un compilador junto con el código fuente a compilar y las instrucciones para ejecutar el programa compilado.
Ciertos lenguajes dinámicos para scripting , como AWK , sed y Perl , tradicionalmente han sido expertos en expresar comandos de una sola línea. Los intérpretes de shell, como los de Unix o Windows PowerShell, permiten construir potentes comandos de una sola línea.
El uso de la expresión " one-liner" (una línea) se ha ampliado para incluir también el código fuente del programa, en referencia a cualquier lenguaje que realice alguna función útil en una sola línea.
Historia
El concepto de programa de una sola línea se conoce desde la década de 1960 [ 1 ] con el lanzamiento del lenguaje de programación APL . Con su sintaxis concisa y sus potentes operadores matemáticos, APL permitió representar programas útiles con pocos símbolos.
En la década de 1970, los programas de una sola línea se asociaron con el auge de la computadora personal y BASIC . Las revistas de informática publicaban programas escritos en muchos dialectos de BASIC. Algunas revistas dedicaban columnas regulares exclusivamente a programas cortos e impresionantes de una sola línea. [ 2 ]
El término «One-liner» también aparece dos veces en el índice del libro «The AWK Programming Language» (conocido comúnmente por la abreviatura TAPL ). En él se explica el lenguaje de programación AWK , que forma parte del sistema operativo Unix . Los autores explican el origen del paradigma de la «one-liner» a través de su trabajo diario en las primeras máquinas Unix .
La versión de 1977 solo tenía unas pocas variables integradas y funciones predefinidas. Fue diseñada para escribir programas cortos […] Nuestro modelo era que una invocación constara de una o dos líneas, se escribiera y se usara inmediatamente. Los valores predeterminados se eligieron para que coincidieran con este estilo […] Como autores, sabíamos cómo se suponía que debía usarse el lenguaje, así que solo escribimos líneas de código.
Nótese que esta definición original de una línea implica la ejecución inmediata del programa sin compilación. Por lo tanto, en sentido estricto, solo el código fuente de los lenguajes interpretados califica como una línea . Pero esta comprensión estricta de una línea se amplió en 1985 cuando el IOCCC introdujo la categoría de Mejor Línea para C , que es un lenguaje compilado .
Ejemplos
Las frases cortas también se utilizan para mostrar la capacidad expresiva diferencial de los lenguajes de programación . Con frecuencia, se emplean para demostrar la habilidad en programación. A menudo se organizan concursos para ver quién crea la frase corta más excepcional.
BÁSICO

Una sola línea de BASIC normalmente puede contener hasta 255 caracteres, y las líneas de código abarcaban desde juegos sencillos [ 3 ] hasta demostraciones gráficas. Una de las líneas de código de demostración más conocidas se conoce coloquialmente como 10PRINT , escrita para la Commodore 64 :
10 PRINT CHR$ ( 205.5 + RND ( 1 )); : GOTO 10do
El siguiente ejemplo es un programa en C (un programa ganador en la categoría "Mejor programa de una sola línea" del IOCCC ).
main ( int c , char ** v ) { return ! m ( v [ 1 ], v [ 2 ]); } m ( char * s , char * t ) { return * t - 42 ? * s ? 63 == * t | * s == * t && m ( s + 1 , t + 1 ) : ! * t : m ( s , t + 1 ) || * s && m ( s + 1 , t ); }Este programa de una sola línea es un comparador de patrones glob. Entiende los caracteres glob *, que significa cero o más caracteres, y ?, que significa exactamente un carácter, al igual que la mayoría de los shells de Unix .
Ejecútalo con dos argumentos: la cadena y el patrón glob. El estado de salida es 0 (shell true) cuando el patrón coincide, y 1 en caso contrario. El patrón glob debe coincidir con toda la cadena, por lo que es recomendable usar * al principio y al final del patrón si buscas algo en el medio. Ejemplos:
$ ./a.out foo 'f??' ; echo $? $ ./a.out 'mejor programa corto' '??stop?*' ; echo $?AWK
El libro " El lenguaje de programación AWK" contiene 20 ejemplos de comandos de una sola línea al final del primer capítulo.
Aquí están los primeros de ellos:
- Imprime el número total de líneas de entrada (como wc -l ):
FIN { imprimir NR }
- Imprime la décima línea de entrada:
NR == 10
- Imprime el último campo de cada línea de entrada:
{ imprimir $ NF }
J
Aquí hay ejemplos en J :
- Una función llamada avg que devuelve el promedio de una lista de números:
promedio =: +/ % #
- Ordenación rápida :
clasificación rápida =: (( $:@ ( <#[ ) , ( =#[ ) , $:@ ( >#[ )) ( {~ ?@# )) ^: ( 1 <# )
Perl
Aquí hay ejemplos en el lenguaje de programación Perl :
- Busque palabras duplicadas
perl -0777 -ne ' 'print"$.: doubled $_\n"while/\b(\w+)\b\s+\b\1\b/gi- Encuentra palíndromos en /usr/dict/words
perl -lne ' ' /usr/dict/wordsprintif$_eqreverse- edición in situ de archivos *.c cambiando todos los foo a bar
perl -p -i.bak -e ' s/\bfoo\b/bar/g' *.cMuchas líneas de código son prácticas. Por ejemplo, la siguiente línea de código Perl invertirá todos los bytes de un archivo:
perl -0777e 'imprimir escalar inverso <>' nombre de archivo Si bien la mayoría de las líneas de código Perl son imperativas, la compatibilidad de Perl con funciones anónimas, cierres, mapeo, filtrado ( grep ) y plegado (List::Util::reduce) permite la creación de líneas de código "funcionales".
Esta línea de código crea una función que se puede utilizar para devolver una lista de números primos hasta el valor del primer parámetro:
mi $z = sub { grep { $a = $_ ; ! grep { ! ( $a % $ _ ) } ( 2 .. $_ - 1 )} ( 2 .. $_ [ 0 ]) }Se puede usar en la línea de comandos, así:
perl -e' ' número$,=",";printsub{grep{$a=$_;!grep{!($a%$_)}(2..$_-1)}(2..$_[0])}->(shift)para imprimir una lista de números primos separados por comas en el rango 2 - número.
Haskell
El siguiente programa Haskell es de una sola línea: ordena sus líneas de entrada ASCIIbetically .
main = ( mapM_ putStrLn . Data . List . sort . lines ) =<< getContents -- En ghci, un nombre calificado como Data.List.sort funcionará, aunque como ejecutable independiente necesitarías importar Data.List.Una versión aún más corta:
principal = interactuar ( líneas no lineales . Datos . Lista . ordenar . líneas ) -- Ídem.Se puede usar en la línea de comandos de la siguiente manera:
cat nombre_archivo | ghc -e "interactuar (unlines . Data.List.sort . líneas)"Raqueta
El siguiente programa Racket es equivalente al ejemplo Haskell anterior:
#lang racket ( para cada displayln ( ordenar ( puerto->líneas ) cadena<? ))y esto se puede usar en la línea de comandos de la siguiente manera:
raqueta -e ' '(for-eachdisplayln(sort(port->lines)string<?))Pitón
Se pueden ejecutar comandos de una sola línea directamente en la línea de comandos de Unix utilizando la opción -cmd de Python (o -c), y normalmente requiere la importación de uno o más módulos. Las instrucciones se separan con ";" en lugar de saltos de línea. Por ejemplo, para imprimir el último campo de una lista larga de Unix:
ls -l | python -c " "importsys;[sys.stdout.write(' '.join([line.split(' ')[-1]]))forlineinsys.stdin]Envoltorios de Python
Se han desarrollado varios scripts de código abierto para facilitar la creación de comandos de Python de una sola línea. Scripts como pyp o Pyline importan módulos de uso común y proporcionan variables más legibles para humanos, con el objetivo de hacer que la funcionalidad de Python sea más accesible desde la línea de comandos. Aquí se muestra una versión revisada del ejemplo anterior (que imprime el último campo de una lista larga de Unix):
ls -l | pyp "whitespace[-1]" # "whitespace" representa cada línea dividida por espacios en blanco en pyp ls -l | pyline "words[-1]" # "words" representa cada línea dividida por espacios en blanco en pylineBibliotecas ejecutables
El módulo Python CGIHTTPServer, por ejemplo, también es una biblioteca ejecutable que funciona como un servidor web con CGI. Para iniciar el servidor web, introduzca:
$ python -m CGIHTTPServer Sirviendo HTTP en 0.0.0.0 puerto 8000 …Tcl
Tcl (Tool Command Language) es un lenguaje de programación/scripting dinámico basado en conceptos de Lisp, C y shells de Unix. Puede utilizarse de forma interactiva o ejecutando scripts (programas) que pueden usar un sistema de paquetes para su estructuración. [ 4 ]
Muchas cadenas de caracteres también son listas bien formadas. Cada palabra simple es una lista de longitud uno, y los elementos de las listas más largas están separados por espacios en blanco. Por ejemplo, una cadena que corresponde a una lista de tres elementos:
ejemplo de conjunto { foo bar grill }Las cadenas con comillas o llaves desequilibradas, o con caracteres distintos de espacios que siguen directamente a las llaves de cierre, no se pueden analizar directamente como listas. Para crear una lista, puede dividirlas explícitamente.
El "constructor" para listas se llama, por supuesto, `list`. Se recomienda usarlo cuando los elementos provienen de la sustitución de variables o comandos (las llaves no funcionan así). Como los comandos de Tcl son listas, lo siguiente es un sustituto completo del comando `list`:
proc list args {set args }Windows PowerShell
Cómo encontrar palíndromos en el archivo words.txt
Obtener-Contenido palabras . txt | Donde { $_ -eq -join $_ [( $_ . length - 1 ).. 0 ] }La semántica de canalización en PowerShell permite crear escenarios complejos con programas de una sola línea. Este script de PowerShell de una sola línea toma una lista de nombres y recuentos de un archivo de valores separados por comas y devuelve la suma de los recuentos de cada nombre.
ipcsv .\ fruit . txt – H F , C | Grupo F |%{@{ " $( $_ . Nombre ) " =( $_ . Grupo | medida C - suma ). Suma }}| valor de ordenaciónVéase también
Referencias
- ↑ 10 IMPRIMIR CHR$ (205,5 + RND (1)); : IR A 10 (PDF) . Prensa Mit. 2014. pág. 148.ISBN 9780262526746Consultado el 3 de julio de 2018 .
- ↑ "Revista RUN número 35" . Noviembre de 1986.
- ↑ "Juegos de una línea de usuario de Acorn (Escape From Voros, Lexxias, Race To Varpon, Storm Clouds Over Zaqqit, Zander (también conocido como Lurch))" . bbcmicro.co.uk . Consultado el 3 de julio de 2018 .
- ↑ A continuación se presentan citas directas de Tcl Programming en Wikibooks que están disponibles bajo la Licencia Creative Commons Atribución-CompartirIgual .

Enlaces externos
- Enlaces de programación en Perl
- Introducción a la programación Tcl gratuita de Wikibooks y descarga del PDF
- SourceForge , sitio web de descarga y también varios lenguajes de programación.
- Tcl Sources , sitio web principal para descargar el código fuente de Tcl y Tk.
- Wiki de Tcler , centro de referencia y scripts de Tcl/Tk
- TkDocs , documentación y archivos oficiales de Tcl/Tk
- Programación informática