パスカルの三角形

が流行っているらしいのですいつの話だ。

D で書きました。残念ながらコンパイルが通りませんが結果オーライ。改行とかできないのでぜんぜん三角形になりません。

i@u ~/test/d> dmd pascal.d
pascal.d(55): static assert  (0) is false, "[ 1 ] [ 1 1 ] [ 1 2 1 ] [ 1 3 3 1 ] 
[ 1 4 6 4 1 ] [ 1 5 10 10 5 1 ] [ 1 6 15 20 15 6 1 ] "

MPL とか無くても割となんとかなるなーという感でした。以下コード。

template itoa_(int n) {
    template digit(long n) { const char [] digit = "0123456789"[n..n+1]; }
    static if (n<0)  const char [] s = "-" ~ itoa_!(-n).s;
    else static if (n<10L) const char [] s = digit!(n);
    else const char [] s = itoa_!(n/10L).s ~ digit!(n%10L);
}

template itoa(long n) {
    const char [] itoa = itoa_!(n).s;
}

class list {}

template head(T) { const int head = T.sizeof/typeof(T[0]).sizeof; }
template tail(T) { alias typeof(T[0]) tail; }

template ltoa_(T) {
    const char[] ltoa_ = ltoa_!(tail!(T)) ~ itoa!(head!(T)) ~ " ";
}
template ltoa_(T : list) {
    const char[] ltoa_ = "";
}
template ltoa(T) {
    const char[] ltoa = "[ " ~ ltoa_!(T) ~ "]";
}

template pascal_line2(int h, V) {
    alias pascal_line!(V)[h+head!(V)] pascal_line2;
}
template pascal_line2(int h, V : list) {
    alias pascal_line!(V)[h] pascal_line2;
}
template pascal_line(T) {
    alias pascal_line2!(head!(T), tail!(T)) pascal_line;
}
template pascal_line(T : list) {
    alias list pascal_line;
}

template pascal_(T, int n) {
    alias pascal_line!(T)[1] l;
    const char[] r = ltoa!(l) ~ " " ~ pascal_!(l, n-1).r;
}
template pascal_(T, int n : 0) {
    const char[] r = "";
}

template pascal(int n) {
    const char[] r = pascal_!(list, n).r;
    static assert(false, r);
}

pascal!(7) p;

参考文献。

itoa: http://www.digitalmars.com/d/archives/digitalmars/D/29734.html

list: http://www.kmonos.net/wlog/35.php#_0043040201

あ、ちなみに static-array は 7次元が限度だそうです。シンボルは以下のような感じになってました

00000000 D _D6pascal46__T7pascal_TG1G6G15G20G15G6G1C6pascal4listVi0Z1rAa

デマングルすると、

00000000 D char[] pascal.__T5ltoa!(typedef class pascal.list[1][6][15][20][15][6][1]).ltoa!()

ちゃんと答えが入ってますな。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h