特殊化された拡張メソッドの使用例

先日のNyaRuRuさんのエントリ(d:id:NyaRuRu:20080328:p1)の考え方は自分の中に無かった。面白かったです。便利そうだけどパッと応用例が浮かばない・・・。C++屋さんなら得意かもしれませんね。

確かに私もそれほど応用例をすぐに思いつけるわけではないのですが,前回の「一次元ぷよ」の代わりに .NET の Virtual Execution System (VES) の評価スタックを考えてみるとか.
JVM .NET VM の有名な違いとして,Java bytecode では型ごとに加算命令が用意されているのに対し,.NET では Add opcode が複数の型にオーバーロードされているというものがあります*1
オーバーロードされているといっても,operand の型に対して opcode 実行結果の型は静的に決まるので,ある時点で評価スタックに積まれている要素の型は静的に解析可能です.ただ,これを行うためにスタック状態を追跡していくのが面倒というだけで.
ここで,「一次元ぷよ」のときのテクニックを利用します.評価スタックのスタックトップからいくつか要素を見て,その型に応じて可能な opcode を提示することにしてみましょう.
以下その例です.VES は,Int32 と Int32 の Add をサポートしていますが,Double と Int32 の Add はサポートしていません.

C++ における関数 template の特殊化と見れば,それほど珍しくないテクニックかもしれませんが,インタラクティブなコード検証を支援する DSL として見てみると,なかなか新鮮な気がしてきます.

*1:[http://www.shudo.net/diary/2002mar.html#20020328:title=技術フェチ日記 2002年 3月28日],[http://groups.yahoo.co.jp/group/jvm-talk/message/53?expand=1:title=JVM and .NET CLR - jvm-talk - Yahoo!グループ]