なんか 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);