Originalmente, un programa de una sola línea era una entrada textual a la línea de comandos de un shell del sistema operativo que realiza alguna función en una sola línea de entrada. El one-liner puede ser
- una expresión escrita en el lenguaje de la concha;
- la invocación de un intérprete junto con la fuente del programa para que lo ejecute el intérprete;
- la invocación de un compilador junto con el código fuente para compilar e instrucciones para ejecutar el programa compilado.
Ciertos lenguajes de secuencias de comandos dinámicos como AWK , sed y Perl han sido tradicionalmente expertos en expresar frases ingeniosas. Los intérpretes de shell especializados , como los shells de Unix o Windows PowerShell, permiten la construcción de potentes frases breves.
El uso de la frase de una sola línea se ha ampliado para incluir también el código fuente del programa para cualquier idioma que haga algo útil en una línea.
Historia
El concepto de un 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 potentes operadores matemáticos, APL permitió que programas útiles se representaran en unos pocos símbolos.
En la década de 1970, las frases ingeniosas se asociaron con el surgimiento de la computadora doméstica y el BASIC . Las revistas de informática publicaron programas de mecanografía en muchos dialectos de BASIC. Algunas revistas dedicaban columnas regulares únicamente a impresionantes programas breves y de una línea. [2]
La palabra One-liner también tiene dos referencias en el índice del libro The AWK Programming Language (a menudo se hace referencia al libro con la abreviatura TAPL ). Explica el lenguaje de programación AWK , que es parte del sistema operativo Unix . Los autores explican el nacimiento del paradigma de una sola línea con su trabajo diario en las primeras máquinas Unix :
La versión de 1977 tenía solo unas pocas variables integradas y funciones predefinidas. Fue diseñado para escribir programas cortos […] Nuestro modelo era que una invocación tendría una o dos líneas de largo, se escribiría y se usaría inmediatamente. Se eligieron valores predeterminados para que coincidieran con este estilo […] Nosotros, como autores, sabíamos cómo se suponía que debía usarse el idioma, por lo que solo escribimos frases breves.
Tenga en cuenta que esta definición original de una sola línea implica la ejecución inmediata del programa sin ninguna compilación. Entonces, en un sentido estricto, solo el código fuente para los lenguajes interpretados califica como una línea . Pero esta comprensión estricta de una sola línea se amplió en 1985 cuando el IOCCC introdujo la categoría de Best One Liner para C , que es un lenguaje compilado.
Ejemplos de
Las frases ingeniosas también se utilizan para mostrar el poder expresivo diferencial de los lenguajes de programación . Con frecuencia, se utilizan frases breves para demostrar la capacidad de programación. A menudo se realizan concursos para ver quién puede crear la frase más excepcional.
BÁSICO
Una sola línea de BASIC normalmente puede contener hasta 255 caracteres, y una línea va desde juegos simples [3] hasta demostraciones gráficas. Uno de los ejemplos de demostración más conocidos se conoce coloquialmente como 10PRINT , escrito para el Commodore 64 :
10 IMPRIMIR CHR $ ( 205.5 + RND ( 1 )); : GOTO 10
C
El siguiente ejemplo es un programa C (una entrada ganadora en la categoría "Mejor de una sola línea" del IOCCC ).
main ( int c , char ** v ) { ¡ volver ! 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 globales. Entiende los caracteres globales '*' que significan 'cero o más caracteres' y '?' lo que significa exactamente un carácter, como la mayoría de los shells de Unix .
Ejecútelo con dos argumentos, la cadena y el patrón glob. El estado de salida es 0 (shell verdadero) cuando el patrón coincide, 1 en caso contrario. El patrón glob debe coincidir con toda la cadena, por lo que es posible que desee usar * al principio y al final del patrón si está buscando algo en el medio. Ejemplos:
$ ./a.out foo 'f ??' ; echo $? $ ./a.out 'mejor programa corto' '?? st * o ** p? *' ; echo $?
AWK
El TAPL libro contiene 20 ejemplos de una sola línea al final del primer capítulo del libro.
Aquí están los primeros de ellos:
- Imprima el número total de líneas de entrada:
FIN { imprimir NR }
- Imprima la décima línea de entrada:
NR == 10
- Imprima el último campo de cada línea de entrada:
{ imprimir $ NF }
J
Aquí hay ejemplos en J :
- Una función avg para devolver el promedio de una lista de números:
avg =: + / % #
- Clasificación rápida :
ordenació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 / wordsprint if $_ eq reverse
- edición en el lugar de archivos * .c cambiando todos los foo a la barra
perl -p -i.bak -e ' s/\bfoo\b/bar/g
' * .c
Muchas frases ingeniosas son prácticas. Por ejemplo, la siguiente línea única de Perl invertirá todos los bytes en un archivo:
perl -0777e 'imprimir escalar inverso <>' nombre de archivo
Mientras que la mayoría de Perl de una sola línea son imprescindibles, el apoyo de Perl para funciones anónimas, cierres, mapa, filtro (grep) y plegar (Lista :: Util :: reducir) permite la creación de una sola línea 'funcionales'.
Esta línea simple crea una función que se puede usar para devolver una lista de números primos hasta el valor del primer parámetro:
my $ z = sub { grep { $ a = $ _ ; ! grep { ! ( $ a % $ _ ) } ( 2 .. $ _ - 1 )} ( 2 .. $ _ [ 0 ]) }
Se puede usar en la línea de comando, así:
perl -e ' ' número$,=",";print sub { 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 de Haskell es de una sola línea: ordena sus líneas de entrada ASCIIbéticamente .
main = ( mapM_ putStrLn . Data . List . sort . lines ) = << getContents - En ghci, un nombre calificado como Data.List.sort funcionará, aunque como ejecutable independiente necesitaría importar Data.List.
Una versión aún más corta:
main = interactuar ( unlines . Data . List . sort . lines ) - Ditto.
Utilizable en la línea de comando como:
cat nombre de archivo | ghc -e "interactuar (unlines. Data.List.sort. líneas)"
Raqueta
El siguiente programa Racket es equivalente al ejemplo de Haskell anterior:
#lang racket ( para cada displayln ( sort ( port-> líneas ) string ))
y esto se puede usar en la línea de comando de la siguiente manera:
raqueta -e ' '(for-each displayln (sort (port->lines) string))
Pitón
La ejecución de frases breves directamente en la línea de comandos de Unix se puede lograr usando la marca -cmd de Python (-c para abreviar), y generalmente requiere la importación de uno o más módulos. Las declaraciones se separan mediante ";" en lugar de nuevas líneas. Por ejemplo, para imprimir el último campo de la lista larga de Unix:
ls -l | python -c " "import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]
Envoltorios de Python
Se han desarrollado varios scripts de código abierto para facilitar la construcción de una sola línea de Python. Los scripts como pyp o Pyline importan módulos de uso común y proporcionan más variables legibles por humanos en un intento de hacer que la funcionalidad de Python sea más accesible en la línea de comandos. Aquí hay un rehacer del ejemplo anterior (imprimiendo el último campo de una lista larga de Unix):
ls -l | pyp "espacio en blanco [-1]" # "espacio en blanco" representa cada línea dividida en un espacio en blanco en pyp
ls -l | pyline "palabras [-1]" # "palabras" representa cada línea dividida en un espacio en blanco en pyline
Bibliotecas 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 ingrese:
$ python -m CGIHTTPServer Sirviendo HTTP en 0.0.0.0 puerto 8000…
Lenguaje de control de herramientas TCL
Tcl (Tool Command Language) es un lenguaje de programación / scripting dinámico basado en conceptos de shells Lisp, C y Unix. Se puede utilizar de forma interactiva o mediante la ejecución de scripts (programas) que pueden utilizar un sistema de paquetes para estructurar. A continuación se presentan citas directas de Wiki Books Tcl Programming. El texto de la programación de Wiki Books Tcl está disponible bajo la licencia Creative Commons Attribution-ShareAlike.
Muchas cadenas también son listas bien formadas. Cada palabra simple es una lista de longitud uno, y los elementos de listas más largas están separados por espacios en blanco. Por ejemplo, una cadena que corresponde a una lista de tres elementos:
poner el ejemplo { foo bar grill }
Las cadenas con comillas o llaves no balanceadas, o caracteres sin espacio directamente después de llaves de cierre, no se pueden analizar como listas directamente. Puede dividirlos explícitamente para hacer una lista.
El "constructor" de listas se llama, por supuesto, lista. Se recomienda usarlo cuando los elementos provienen de la sustitución de variables o comandos (las llaves no hacen eso). Como los comandos Tcl son listas de todos modos, lo siguiente es un sustituto completo del comando list:
# One liners program proc list args {set args }
Windows PowerShell
Encontrar palíndromos en el archivo words.txt
Palabras de contenido . txt | Donde { $ _ -eq -join $ _ [( $ _ . Longitud - 1 ) .. 0 ] }
La semántica de canalización en PowerShell ayuda a habilitar escenarios complejos con programas de una sola línea. Esta línea única en el script de PowerShell 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 -sum ). Sum }} | valor de clasificación
Ver también
Referencias
- ^ 10 IMPRIMIR CHR $ (205.5 + RND (1)); : GOTO 10 (PDF) . Mit Press. 2014. p. 148. ISBN 9780262526746. Consultado el 3 de julio de 2018 .
- ^ "Revista RUN número 35" .
- ^ "Juegos de una línea de usuario de Acorn (Escape de Voros, Lexxias, Race To Varpon, Nubes de tormenta sobre Zaqqit, Zander (AKA Lurch))" . bbcmicro.co.uk . Consultado el 3 de julio de 2018 .
enlaces externos
- Enlaces de programación de Perl
- Introducción a la programación Tcl gratuita de Wikilibros y descargar pdf
- [1] sourceforge net, sitio web de descarga y también varios idiomas informáticos
- Tcl Sources , sitio web principal de descarga de código fuente de Tcl y Tk
- Wiki de Tcler , scripts de Tcl / Tk y cámara de compensación de referencias
- TkDocs , Tcl / Tk Documentación y archivos oficiales