クロージャを実装しました。
レキシカルスコープによるアクセスを検出して、自動的に引数を追加してdelegateを生成しています。パーサの側でdelegateを挿入することで簡単に実装できました。
明示的にdelegateキーワードを指定する必要はほとんどなくなりました。以下に対比例を示します。
var mul = \a => delegate(a, \(a, b) => a * b);
↓
var mul = \a => \b => a * b;
メンバ関数はインスタンスを指定することでdelegateになります。これはC#を参考にしました。
var delg = delegate(a, Test.Show);
↓
var delg = a.Show;
メンバ関数内のクロージャはthisを省略することができます。
menu.Click.Add(delegate(this, \(this : Form1, sender, e) => { this.SetMode(0); })); ↓ menu.Click.Add(\(sender, e) => { SetMode(0); });
レキシカルスコープを持ったことで、ようやくラムダ式が気軽に使えるようになりました。イベントハンドラをインラインで書いたり、メンバ関数に直接コールバックしたりするのは、GUIの記述に便利です。
当初はGCもない環境でどうやってクロージャを実装しようかと途方に暮れましたが、JITと値束縛という2つのアイデアで乗り切ることができました。関数型っぽい機能は一段落したので、次回からはオブジェクト指向を充実させる予定です。