El reto
En este desafío, especifica un idioma de origen S
y un idioma de destino T
. Su tarea es escribir el siguiente programa P
en el idioma S
. Si se proporciona un programa válido Q
en el idioma T
como entrada P
, generará un programa válido R
en el idioma T
que no recibe entradas y salidas Q(R)
, es decir, el programa Q
aplicado al código fuente de R
. Además , debe presentar en su respuesta un programa de ejemplo no trivial Q
(cuanto más interesante, mejor, aunque no obtenga puntos por esto), el programa resultante R
y la salida de R
. Este es el código de golf, por lo que el código más corto para P
victorias.
En otras palabras, este es un desafío sobre escribir un "constructor universal de quines" que pueda crear tipos arbitrarios de quines generalizadas.
Aclaraciones
- Sus idiomas de origen y destino pueden ser idénticos.
- El programa
P
debe tomar una cadena como entrada (desde STDIN o equivalente), y generar una cadena (hacia STDOUT o equivalente), como debería hacerlo cada programa de salidaR
. - Los programas de entrada
Q
también deben transformar una cadena en otra cadena, pero su forma es más flexible: pueden ser funciones de cadena a cadena, fragmentos de código que modifican una variable con un nombre determinado, fragmentos que modifican la pila de datos si su idioma de destino tiene uno, etc. También puede restringir aún más la forma de losQ
's indicando que, por ejemplo, no pueden contener ningún comentario. Sin embargo, debe ser capaz de implementar cualquier función de cadena a cadena computable como un programa de entradaQ
, y debe indicar explícitamente cómo funcionan y qué restricciones adicionales les impone. - El programa de salida
R
realmente debería ser una quine (generalizada), por lo que no debe leer ninguna entrada (entrada del usuario, archivos, etc.) a menosQ
que lo haga. - Las lagunas estándar no están permitidas.
Un ejemplo
Supongamos que elijo Python como mi idioma de origen y Haskell como mi idioma de destino, y además necesito que el programa de entrada sea una definición de una línea de una String -> String
función llamada f
. Si doy el programa de inversión de cadenas
f x = reverse x
como entrada a mi programa Python P
, generará el código fuente de otro programa Haskell R
. Este programa imprime en STDOUT el código fuente de R
, pero se invierte. Si P
se le da la función de identidad
f x = x
Como entrada, el programa de salida R
es una quine.