Haskell -> Python -> Ruby -> Haskell

Un quine es un programa cuya salida es su código fuente. Llamado así en honor al filósofo W. V. Quine. Cuando un quine entrega el código de otro lenguaje es un quine de segundo orden. Y así sucesivamente con la condición de regresar al código original. Lo que presento a continuación es un quine de tercer orden (y la razón del título de este post).

Este es el código en Haskell:

q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"

Lo ejecutamos en Linux para que su salida sea interpretada por Python, y la salida de éste por Ruby, quien nos entrega el código original en Haskell.

$ runhaskell quine.hs | python | ruby
q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']
main=q "q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show c ++ [','] ++ show a ++ [')']" "def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')'" "def e(x) return 34.chr+x+34.chr end;def q(a,b,c) print b+10.chr+'main=q '+e(b)+' '+e(c)+' '+e(a)+' '+10.chr end"

Cómo código es una rareza, una obra de arte de la programación que si no me equivoco fue creada por sigfpe en 2008.

Alucinante.

3 Responses to “Haskell -> Python -> Ruby -> Haskell”

  1. Antonio Nuñez writes:

    En verdad que es una joyita de codigo… gracias por sus aportes

  2. Memo writes:

    Bárbaro!

  3. diacus writes:

    Me va a tomar un rato entender cómo funciona :)

Leave a Reply