5

これは、元のHaskellプログラムを出力するRubyプログラムを出力するPythonプログラムを出力する特別なHaskellプログラムです(http://blog.sigfpe.com/2008/02/third-order-quine-in-three-languagesから)。 html

より正確には、出力はこの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"

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

実行後にRubyプログラムを出力します。

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

そして最後に、Rubyプログラムは元の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"

従来のクインプログラムは、プログラムを2つの部分に分割することで構築できるため、partAにはpartBの説明が含まれ、partBは説明からAを計算します。

しかし、そのような3次のクワインはどのように構築されたのでしょうか?

4

4 に答える 4

2

まず、このプログラミングの割り当てに頭を悩ませます。私を信じてください、あなたがそれにしばらく時間を費やすならば、それは実際にはそれほど難しいことではありません。アイデアは、別のプログラムを入力として受け取り、2つのプログラムを組み合わせて、それ自体のテキストを理解する3番目のプログラムを出力として吐き出すことができるプログラムを作成できるということです。それは一種の高階のクワインです。3つのプログラミング言語すべての構造を理解していれば、この課題からアイデアを取り入れて、さらに拡張することができます。

于 2009-08-29T01:50:51.110 に答える
2

クリーネの再帰定理は、理論上、ほとんどすべての言語でクワインを構築することを可能にします。(詳細はこちら。)私自身は今のところそれを機能させることができていませんが。

高階クインの場合、考慮すべき機能は言語の評価メカニズムの構成です。KRTから基本的なクワインを取り出すことができれば、より高次のクワインを取り出すことができるかもしれません。

于 2009-09-30T09:21:06.700 に答える
1

その記事の最初の段落で、私は簡単な説明を書きました。そこから始めることをお勧めします。

これらのテクニックのいくつかは、BarwiseandMossの著書ViciousCirclesから学びました。

于 2011-01-27T22:41:44.597 に答える
0

私はプログラマーではありませんが()、私には次のように聞こえます。

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

(三角形の)円は、実際の始まりや終わりのない悪質なものです。

プログラムAには、Cの説明を含むBの説明が含まれています。

プログラムBには、Aの説明を含むCの説明が含まれています。

プログラムCには、Bの説明を含むAの説明が含まれています。

おそらくもっと深くなると、多くの異なる言語で円の角を増やすことができます。

于 2011-10-01T16:02:15.577 に答える