ぐるっと巡って、再び DLR へ

一時期、ブームだからと思って手に取った(リフレクションやT4目当てで)「メタプログラミング .NET」なんですが、本棚を整理するときにうっかり捨ててしまったらしく、Kindle で買いなおしました → Amazon.co.jp: メタプログラミング.NET 。どうせだから、洋書で買おうかと思ったけど、英語版の Kindle は無くて、翻訳版のほうが安いってのはどうなの?

後付けでメソッドを付けるというのを考えて、最近 Python でそれができるのを知って、そういえば IronPython ってどうなったの?と思って、再び dynamic と System.Dynamic.ExpandoObject を見直し見たら、ああ以前に ExDoc の expando 版を作ろうと思っていた残骸が HDD に残っていたのを再発見、ってのが現在位置です。でもって、「メタプログラミング .NET」の第8章の最後をよんで、やっぱり DLR って死んでたのね、と想った次第。

Iron系のプログラミングは、現在どうなっているのかわかりませんが(書籍で言及しているのが WinRT 直前だったりするので)、現在 dynamic が使われいるところとすれば、

  • ASP.NET MVC の ViewBag
  • Office COM との相互運用(主に Excel やね)

ってところでしょう。Office 組み込みの .NET は完全に死んだ感じがするし、JavaScript プラグインは生きているのか死んでいるのかも分かりません。Excel VBA は未だに健在なわけですが、VBA 自体(あるいは VB6.0)の完全互換な後継を作らない限り、Office 系の VBA はそののままで、Office 386 あたりのブラウザ版が完全に「代替」になる(デスクトップ版のExcelを駆逐するという意味で)になるかは、怪しいですよね。

特に、C# や F# に別の言語体系を組み込みたいわけではないので、DLR を詳細にやろうとは思わないのですが(Unix的には、別コマンドで呼び出せばいいわけだし)、基本的な C# の使い方とはちょっと違う面を、C# の世界に取り込みたいという願望はあります。ExDoc の演算子のオーバーロードと暗黙のキャストを多用した方式や、 D4Reflection でプライベートメソッドをリフレクションを使って呼び出してみたり、XFormsPreviewer で動的に XAML を読み込んで動的にイベントメソッドに結び付けたり、という感じで、少しメタちっくに動かしています(まあ、それぞれ頓挫しているわけですが)。

メタプログラミング .NET 当時は、System.Dynamic.ExpandoObject の詳細は見れなくて(M$ と契約している場合は別だろうけど)あれこれと、互換コードを作るしかなかったのですが、.NET Core としてオープンソース化されたので、dynamic も ExpandoObject のコードも github 上のcorefx/ExpandoObject.cs at master · dotnet/corefx で確認ができます。また、Xamarin.Forms で XAML をローディングしているところも、Xamarin.Forms 自体がオープンソースになったので、Xamarin.Forms/XamlLoader.cs at master · xamarin/Xamarin.Forms でコードを確認できます。いまのところ、.NET Core に WPF や UWP の XAML は含まれていないのですが、おおむね Xamarin.Forms.XAML と似たコードになっていると推測ができます…つーか、ここの XAML をアセンブリ内のクラスに動的にバインディングしている部分を切り離せば、各種の XAML を Parser と Loading/Binding に分けられたのに、なんでこう一括してしまうかなー、という具合なのですが。まあ、このあたりのコードをまるっと持ってきて、整合性をあわせれば、オレオレ ExpandoObject や XAML 動的ローダーも作れるというわけです。

そんな訳で、System.Dynamic.* あたりを使うと Python と同じように後付けのメソッドやプロパティを作れることが分かりました。ああ、作れるな、ってのが分かって、

class ExDoc : IDynamicMetaObjectProvider,
    IDictionary<string, Object>, 
    ICollection<KeyValuePair<string, Object>>,
    IEnumerable<KeyValuePair<string, Object>>, 
    IEnumerable, 
    INotifyPropertyChanged

な感じで用意はしていたんですよね。 でも、あっという間にくじけてしまったらしい(4年前のコードだったよ)。このあたりで ExDoc を実装していくと、XML のパーサーが、

 
var name = doc.Person.Name; 

のような感じで、プロパティのように XML のタグ名を使うことができます。これは「メタプログラミング .NET」の中にも例があります。

 
// 属性値を取る 
int age = doc.Person[0].Name.@age; 
// 要素の値を比較して、タグを検索 
var person = doc.Person.Name == "masuda"; 

こんな風な裏技ができそうな気がします。dynamic は型推論をする F# と相性が悪いので、ちょっと頓挫していたのですが、RPi + Python の組み合わせでやり直そうと思っているので、もう少し突っ込んで行こうかなと思っています。

そうそう、後で、F# と PCL の闇を書かないと。どうやら .NET Core で PCL の闇が晴れそうな気がするのですが、久し振りに PCL プロジェクトを作ろうとして、こんな風になって、闇が続いていることが判明(苦笑)

image

まあ、.NET Core に統一すればいいだよね、おそらく。

カテゴリー: C# パーマリンク