.NET(4.0)の上に小さなDSLを実装しています。現在、DSLを実行可能コードのチャンクに変換するためにExpression Treesを使用しています。.NET上でDSLを実装する
DSLは、従来のファイル形式のサポートを実装しているため、事前に定義されています。
表現木はこの仕事に最も適したツールですか?
.NET(4.0)の上に小さなDSLを実装しています。現在、DSLを実行可能コードのチャンクに変換するためにExpression Treesを使用しています。.NET上でDSLを実装する
DSLは、従来のファイル形式のサポートを実装しているため、事前に定義されています。
表現木はこの仕事に最も適したツールですか?
式新しいタイプを生成する場合、ツリーは無用です。そして、典型的なDSLのほとんどは型を構築する必要があります。だから、良い古いSystem.Reflection.Emit
が良い選択である可能性が高いです。
Booをご覧になると、より具体的にはRhino.DSLが作成されています。 Booがテーブル上にもたらすものの印象を得るには、Ayende's postsは素晴らしいスタートです。 pythonのインスピレーションを得たシンタックスと言語およびコンパイラの拡張性を特に重視して共通言語基盤のための
新しいオブジェクト指向の静的型付けプログラミング言語:
ブーはそのようinceptorsによって記述されています。
基本的に、これはC#の代わりです。コンパイルされていますが、より柔軟に、新しい言語構造を動的に設定できるようになります。エクスプレッションツリーは、関係するもののほんの一部です。
Rhino.DSLのように、Booをあなたのパイプラインのどこかに置くことで、膨大な汎用性やパフォーマンスホッグ(まだ実行されているバイトコードがコンパイルされています)が実現します。
the unit tests on Rhino.DSLを見ると、可能なことをすばやく確認できます。
1つのメモ:すべてのリポジトリは現時点ではほとんどアクティブではありませんが(昨年のアクティビティはありません)、IMHOは実際の使用を評価していません。
これはあなたに役立つと思います。
答えていただきありがとうございます、@ SK-logic。少し拡大してください。式ツリーはなぜ新しいタイプを生成しない限り役に立たないのですか? 'Reflection.Emit'はどのようにしてより良く機能しますか? –
@ GregB、私は反対の表現木が新しいタイプを生成するために使用できないことを意味しました。それらをデリゲートにコンパイルすることしかできません。たとえば、データベースをオブジェクトの階層にマップする、ある種のORMのDSLを想像してみてください。それはそのオブジェクトの型を放出しなければならず、あなたはReflection.Emitでのみそれを行うことができます。 –