3

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をキャッシュする方法はありますか(または、理想的にはタイプに対して)?

4

0 に答える 0