2009-08-28 10 views
5

Oto specjalny program Haskell, który wyprowadza program Pythona, który wyprowadza program Ruby że wyprowadza oryginalny program Haskell (od http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languages.html)Każdy pomysł na temat budowy wyższego rzędu programu Quine?

Aby być bardziej dokładnie, wyjście z tego programu 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" 

to program 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 ++ [')']") 

który wyprowadza program Ruby po uruchomieniu,

$ 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)+')'") 

i wreszcie program Ruby wypisuje oryginalny program Haskell.

$ 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" 

Ponieważ tradycyjne Quine programie może być wykonana przez rozdzielenie na dwie części programu, w którym Parta zawiera opis partB i partB oblicza z opisu.

Ale w jaki sposób skonstruowano taki trójpoziomowy quin?

+0

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

Odpowiedz

2

Najpierw obróć głowę wokół numeru this programming assignment. Uwierz mi, to nie jest takie trudne, gdy poświęcisz mu trochę czasu. Pomysł polega na tym, że można napisać program, który może przyjąć inny program jako dane wejściowe i wypluć trzeci program jako wynik, który łączy dwa programy, a także rozumie własny tekst. To coś w rodzaju wyższego rzędu. Jeśli znasz strukturę wszystkich trzech języków programowania, możesz wziąć pomysły z tego zadania i rozszerzyć je dalej.

2

Kleene's recursion theorem teoretycznie umożliwia skonstruowanie quine w prawie każdym języku. (More information here.) Chociaż ja sam nie zdołałem jakoś zmusić go do działania.

W przypadku quine wyższego rzędu funkcja do rozważenia to skład mechanizmów oceny języków. Jeśli uda ci się wyciągnąć podstawową chinę z KRT, może uda ci się zdobyć trochę wyższego zamówienia.

1

W pierwszym akapicie tego artykułu napisałem krótkie wyjaśnienie. Polecam zacząć tam.

Nauczyłem się niektórych z tych technik z książki Podstępne koła autorstwa Barwise'a i Mossa. (! )

0

Nie jestem programistą, ale brzmi to dla mnie:

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

Krąg (trójkąt) jest błędny bez prawdziwego początku ani końca.

Program A cointain opisu B, który zawiera opis C.

Programu B cointain opis C, który zawiera opis A.

program C cointain w opisie, które zawiera opis B.

Prawdopodobnie głębiej można zrobić z wieloma różnymi językami coraz więcej zakrętów na kole.

Powiązane problemy