2009-08-28 16 views
5

Aquí es un programa especial Haskell que da salida a un programa de Python que da salida a un programa de Ruby que emite el programa original Haskell (de http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.html)¿Alguna idea sobre construir un programa Quine de orden superior?

Para ser más exactos, la salida es de este programa 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" 

es un programa Python,

$ runhaskell test.hs 
def q(a,b,c):print b+chr(10)+'q('+repr(b)+','+repr(c)+','+repr(a)+')' 
q("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","q a b c=putStrLn $ b ++ [toEnum 10,'q','('] ++ show b ++ [','] ++ show C++ [','] ++ show a ++ [')']") 

que da salida a un programa de Ruby después de correr,

$ runhaskell test.hs | python 
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 
q("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","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)+')'") 

y finalmente el programa Ruby imprime el programa Haskell original.

$ runhaskell test.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" 

Desde un programa quine tradicional se puede construir mediante la separación de un programa en dos partes en la que Parta contiene una descripción de la Parte B y la Parte B calcula una de la descripción.

Pero, ¿cómo se construyó una quine de tres órdenes?

+0

http://www.reddit.com/r/programming/comments/9ot8y/quinerelay_with_11_programming_languages/ – sdcvvc

Respuesta

2

Primero, ajuste su cabeza alrededor de this programming assignment. Créeme, no es realmente tan difícil una vez que pase algún tiempo en él. La idea es que se puede escribir un programa que puede tomar otro programa como entrada y escupir un tercer programa como salida que combina los dos programas y también entiende su propio texto. Es una especie de Quine de orden superior. Si usted entiende la estructura de los tres lenguajes de programación, puede tomar las ideas de esta asignación y extender aún más.

2

Kleene's recursion theorem en teoría hace posible construir un quine en casi cualquier idioma. (More information here.) Aunque yo mismo no he logrado hasta ahora conseguir que funcione.

Para una quine de orden superior, la función a considerar es la composición de los mecanismos de evaluación de los idiomas. Si usted puede conseguir un quine básica de KRT, tal vez usted podría tener un ir en conseguir un quine orden superior fuera de él.

1

En el primer párrafo de dicho artículo que escribí una breve explicación. Recomiendo comenzar allí.

Aprendí algunas de estas técnicas del libro Vicious Circles de Barwise and Moss. (! )

0

No soy un programador, pero suena como esto a mí:

... -> C -> A -> B -> C> A-> B -> C -> ...

círculo (triángulo) vicioso sin principio o final real.

Programa A cointain una descripción de B que contiene una descripción de C.

Programa B cointain una descripción de C que contiene una descripción de A.

Programa C cointain una descripción de A, que contiene una descripción de B.

Probablemente ir más profundo puede hacer que con muchos idiomas diferentes obtener más esquinas en el círculo.

Cuestiones relacionadas