読者です 読者をやめる 読者になる 読者になる

Expression trees と .NET 風メタプログラミング

.NET

そういえば昔似たようなことをやっていた.



元々 C++ を使っていた人が,C++ 的な template メタプログラミングを C# で再現したくなるのも分からなくはない.しかし,いつまでも template 的な実装にこだわり続けるわけにもいくまい.
個人的な印象では,.NET 全体の潮流は Expression Trees を基盤とした実行時メタプログラミングに向かっている.Dynamic Language Runtime - Docs and specs の expr-tree-spec.doc を読んで,この印象は確信にかなり近づいた.どれぐらいの人数になるかは分からないが,C++ template に対する boost のようなライブラリが,.NET の Expression Trees に対しても欲しいという人間は今後一定数現れるだろう.
たとえば Expression Trees のグラフ簡約評価器.あれば今すぐにでも使いたいぐらいだがこういうのが全然転がっていない*1.まだまだやること,やれることはいくらでもある.
Expression Trees で何ができるのか / どんな追加のライブラリがあると便利なのかについて真剣に考えている人はまだまだ少ない.必要な視点のひとつは,C++ template 的な実装方法や「C++ にはこれがあった」についてとりあえずいったん忘れることではないかと思っている.出発点のリセットが,プログラミングの視野を広げる良いチャンスになることもあるだろう.

おまけ

305 名前: デフォルトの名無しさん [sage] 投稿日: 2008/09/15(月) 02:45:42 
>>304 
ttp://d.hatena.ne.jp/NyaRuRu/20060802 

理論的には簡単に出来るはずだから誰かやってねーかなぁと思って 
ぐぐったら、やっぱり NyaRuRu 氏が取り上げてた 
2.0 考えた LCG 版でも書いてみようかなぁ 

310 名前: デフォルトの名無しさん [sage] 投稿日: 2008/09/15(月) 05:42:11 
>>305 
その記事微妙に勘違いしてる部分がある 
そのままでも動くんだが組み込み演算/ユーザ定義演算で場合分けは不要 
IL見れば分かるけど、内部にGetUserDefinedBinaryOperatorOrThrowというようなメソッドがある 

ほぼすべての演算を定義した構造体をなんとなく作ったけど、あまり使ってないな 

確かにこれはおっしゃる通り.なんでわざわざ場合分けしていたのか気になって(さすがに忘れている),当時のアセンブリを調べてみたところ理由がわかった.LINQ CTP May 2006 に付属する Expression.Add 等は,現在のバージョンと仕様が異なりユーザ定義演算を一切考慮しないので,当時は場合分けが必須だったようだ.その後仕様変更があって今は確かに場合分け不要である.この変更は個人的にもありがたい.

*1:といいつつ探せば絶対誰かが作ってそうな根拠のない印象もある.単純な Call-by-Name と Call-by-Need は『[http://community.bartdesmet.net/blogs/bart/archive/2008/08/22/curry-for-dummies-cont-d-a-happy-ending.aspx:title=CURRY FOR DUMMIES (CONT’D) – A HAPPY ENDIN]』で既にやられている