ジェネリックパラメータの明示的指定

Nemerleには型推論があるため、ジェネリック型を明示的に指定する必要がありませんが、実は明示的に指定する方法もありませんでした。最近やっと可能になったのですが、文法的にちょっとクセがあります。

using Nemerle.IO;

class A [X] {
    public mutable a : X;

    public class B [Y] {
    }
}

def a1 = A ();

// 型推論ジェネリックパラメータXはintとなる
a1.a = 10;  
printf ("%s\n", a1.GetType ().ToString ());

// 型推論を使わず明示的にジェネリックパラメータを指定する
// クラス名と型指定の間に'.'があることに注意
// '.'が無いと[]はインデクサとして扱われてしまう
def a2 = A.[string] ();
printf ("%s\n", a2.GetType ().ToString ());

// ネストクラスの例
def b1 = A.[int].B.[string] ();
printf ("%s\n", b1.GetType ().ToString ());

// このようにも書ける
def b2 = A.B.[int, string] ();
printf ("%s\n", b2.GetType ().ToString ());

/* 結果
A`1[System.Int32]
A`1[System.String]
A`1+B`1[System.Int32,System.String]
A`1+B`1[System.Int32,System.String]
 */

アンケートでは他のアイディアもありましたが、結局、これがシンプルなので採用された次第です。(僕もコレに投票した)