Un Quine es un programa que no toma ninguna entrada pero genera una copia de su propio código. A diferencia de otros lenguajes, escribir un Quine en JavaScript/NodeJS es bastante fácil. El enfoque utilizado es que cualquier función en JavaScript se puede convertir en una string y se puede imprimir. Esto nos permite generar el código de la función como se muestra a continuación:
Ejemplo:
Javascript
function quine() { console.log(quine.toString()) }
Ejemplo: la función anterior imprime su propio código fuente, pero no es un archivo que se pueda ejecutar. Agregaremos una declaración para que se pueda llamar.
Javascript
<script> function quine() {console.log(quine.toString() + " quine();")} quine(); </script>;
Producción:
"function quine() { window.runnerWindow.proxyConsole.log (quine.toString()+\" quine();\") } quine();"
Nota: Necesitábamos agregar algo extra en la declaración de registro para lograr nuestro objetivo. El `;` al final no es necesario.
Podemos hacerlo más elegante. Sabemos que JavaScript puede hacer que una función se ejecute tan pronto como se define utilizando una IIFE ( expresión de función invocada inmediatamente ). Incorporaremos esto en nuestro código como se muestra a continuación:
Ejemplo:
Javascript
<script> ( function quine() {console.log("( " + quine.toString() + " )()")} )() </script>;
Producción:
"( function quine() { window.runnerWindow.proxyConsole.log (\"( \" + quine.toString() + \" )()\") } )()"
Tenga en cuenta que la instrucción console.log() se manipula según sea necesario. Podemos hacerlo aún más hermoso agregando Arrow-Operator y Format-Strings en esta ecuación. Esto produce el código como se indica a continuación.
Ejemplo:
Javascript
($=_=>`($=${$})()`)()
Para comprender el código, eliminamos el IIFE y los paréntesis adicionales en la string de formato. El espaciado se agrega para que quede más claro. El primer `$` es una variable que contiene una función de flecha. `_` es un parámetro aleatorio para la función de flecha que permanece sin usar. Después de la flecha, esta es nuestra string de formato que se puede dividir en 2 partes, la String, “$=”, y la Variable que es primero `$`.
Ejemplo:
Javascript
$ = _ => `$=${$}`
Un Quine debe ser ejecutable, pero eso no significa que un programa que genera errores no pueda ser un Quine. El siguiente ejemplo sigue siendo un ejemplo de un Quine. Este programa, cuando se ejecuta como un archivo .js con la ayuda de NodeJS, genera su propio código fuente. NodeJS devuelve un error en la primera línea y el resto del código muestra cómo se ve el error.
Ejemplo:
Javascript
throw 0 ^ 0