DLR を使用して新しい言語を開発する場合、動的バインディング ロジックはどこに配置する必要がありますか?
私の知る限り、遅延バインディングを実装できる場所は 2 つあります。1 つはバインダーにあり、もう 1 つは DynamicMetaObject サブクラスにあります。
私の現在の実装では、バインダーを使用して操作の種類を識別し、いくつかのカスタム データを保持し、フォールバック メソッドで例外をスローします。実際のバインドは DynamicMetaObject で行われます。
DLR の世界で何がどこに行くのかについての提案はありますか?
DynamicMetaObject をいつ作成するか?
IDynamicMetaObjectProvider
バインディングが必要になるたびに私が見たすべての実装は、DynamicMetaObject サブクラスの新しいインスタンスを作成し、それを返します。これは私には少し奇妙に思えます。たとえば、私の言語には Int32 のラッパーがあり、次のようなものを実行すると:
1+1
1+1
6 つの新しい DynamicMetaObjects が作成されます。オペランドごとに 1 つ、結果ごとに 1 つです。私の場合、同じ値を持つ int のインスタンスは 1 つだけです (この例では、値 1 を持つ int のラッパーのインスタンスは 1 つだけです)。
DynamicMetaObject
常に同じインスタンスに同じものを使用する方法はありますか? DynamicMetaObject を一度作成してからGetMetaObject
メソッドで同じインスタンスを返そうとしましたが、得られたのはエラーだけでしたAn IDynamicMetaObjectProvider created invalid DynamicMetaObject instance.
また、DynamicMetaObject コンストラクターの BindingRestriction パラメーターは、サブクラスを作成するときに効果がないようです (DLR がバインディング制限に基づいて DynamicMetaObject のインスタンスをキャッシュすることを望みました)。たとえばMOをキャッシュする方法はありますか(または、理想的にはタイプに対して)?