【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

クロージャ

クロージャを実装しました。

レキシカルスコープによるアクセスを検出して、自動的に引数を追加して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つのアイデアで乗り切ることができました。関数型っぽい機能は一段落したので、次回からはオブジェクト指向を充実させる予定です。