Concurrent Cleanでquine

haskellのquineが下に挙げたものらしいので、

main=putStr(x++show x);x="main=putStr(x++show x);x="

それを真似しようと思って下のように書いたのだけれど、

module m;import StdEnv;Start=x+++x;x="module m;import StdEnv;Start=x+++x;x="

haskellのshowにあたるものが見つからない。

      • -

じゃあ、Perlのquineは下らしいのですが、

$q=q(print"\$q=q($q);$q");print"\$q=q($q);$q"

今度は、q()にあたるエスケープ文字を無効にするクオーテーションがCLEANにないので、このやり方も使えなさそう。

      • -

ここにquineがたくさん集まっているみたい。
http://www.nyx.org/~gthompso/quine.htm

      • -

Javaのこの戦略が使えるかも

class S{public static void main(Stringa){String s="class S{public static void main(Stringa){String s=;char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}";char c=34;System.out.println(s.substring(0,52)+c+s+c+s.substring(52));}}
      • -

これならどう?

module m;import StdEnv;Start=x+++c+++x+++c;c=toString(toChar 34);x="module m;import StdEnv;Start=x+++c+++x+++c;c=toString(toChar 34);x="

前後に、クオーテーションがついちゃうな。

      • -

完成

module m;import StdEnv;Start w#(s,w)=stdio w;#s=fwrites(x+++c+++x+++c)s;#(_,w)=fclose s w;=w;c=toString(toChar 34);x="module m;import StdEnv;Start w#(s,w)=stdio w;#s=fwrites(x+++c+++x+++c)s;#(_,w)=fclose s w;=w;c=toString(toChar 34);x="
      • -

短いquineもいいですけど、長いquineを作るのも、それはそれで難しそう。