自作言語 oak その2

型とメタプログラミングについて。 var の仕様について。

let a: var (int, int) = (3, 5)
a = (4, 6)    // pass
a!!0 = 4; a!!1 = 6    // error

let b: var [int] = [4, 6, 8, 10]
b = [3, 5, 7, 9]    // pass
b !! 0 = 3    // error

これを見れば大体わかると思う。

だが、var を再帰的に適用したいときがある。三次元配列の全てを自由にいじれる型は、

var [ var [ var [ var int ] ] ]

という型を持つが、これは書くのが大変である。そこで、mut という、型に対して型を返すメタ関数を、

mut int = var int
mut a -> b = var ( a -> b )
mut [a] = var [ mut a ]
mut *a = var ( *(mut a) )
mut (a0, ..., an) = var (mut a0, ..., mut an)

とすれば便利だ。しかし、これを言語仕様として定めずに、言語内でこの mut というメタ関数を書けるようにしたら面白くなるだろう。D言語のテンプレートに近いものを感じる。