compile time quine in D

http://shinh.skr.jp/d/quine.d

なんか pragma msg は計算結果が使えないという勘違いをしていたのですが、なんか色々やってみたらできました。もうちょい短くしたいところですね。

template c(int v){const char[] c=""~cast(char)v;}
const char[] x="pragma(msg,c!(116),c!(101),c!(109),c!(112),c!(108),c!(97),c!(116),c!(101),c!(32),c!(99),c!(40),c!(105),c!(110),c!(116),c!(32),c!(118),c!(41),c!(123),c!(99),c!(111),c!(110),c!(115),c!(116),c!(32),c!(99),c!(104),c!(97),c!(114),c!(91),c!(93),c!(32),c!(99),c!(61),c!(34),c!(34),c!(126),c!(99),c!(97),c!(115),c!(116),c!(40),c!(99),c!(104),c!(97),c!(114),c!(41),c!(118),c!(59),c!(125),c!(10),c!(99),c!(111),c!(110),c!(115),c!(116),c!(32),c!(99),c!(104),c!(97),c!(114),c!(91),c!(93),c!(32),c!(120),c!(61),c!(34),x,c!(34),c!(59),c!(10),x);";
pragma(msg,c!(116),c!(101),c!(109),c!(112),c!(108),c!(97),c!(116),c!(101),c!(32),c!(99),c!(40),c!(105),c!(110),c!(116),c!(32),c!(118),c!(41),c!(123),c!(99),c!(111),c!(110),c!(115),c!(116),c!(32),c!(99),c!(104),c!(97),c!(114),c!(91),c!(93),c!(32),c!(99),c!(61),c!(34),c!(34),c!(126),c!(99),c!(97),c!(115),c!(116),c!(40),c!(99),c!(104),c!(97),c!(114),c!(41),c!(118),c!(59),c!(125),c!(10),c!(99),c!(111),c!(110),c!(115),c!(116),c!(32),c!(99),c!(104),c!(97),c!(114),c!(91),c!(93),c!(32),c!(120),c!(61),c!(34),x,c!(34),c!(59),c!(10),x);

以下を参考にしました。

http://it.wikipedia.org/wiki/Quine#Esempio_di_quine_in_BASIC

実行例はこんな感じ。いや実行してないので実行というのもヘンですが…

i@u ~/test/d> dmd -c quine.d > quine2.d
i@u ~/test/d> dmd -c quine2.d > quine3.d
i@u ~/test/d> dmd -c quine3.d > quine4.d
i@u ~/test/d> diff quine.d quine4.d

追記。 `` 文字列リテラルを思い出したので、だいぶ短くなりました。 template いらなかった。 184B 。改行取ったらたぶん 6B 縮むけど。

const char[]c=""~'"';
const char*x="pragma(msg,`const char[]c=`,c,c,`~'`,c,`';
const char*x=`,c,x,c,`;
`,x);";
pragma(msg,`const char[]c=`,c,c,`~'`,c,`';
const char*x=`,c,x,c,`;
`,x);
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h