使用 DLR 开发新语言时,动态绑定逻辑应该放在哪里?
据我所知,有两个可能的地方可以实现后期绑定。一个在活页夹中,另一个在 DynamicMetaObject 子类中。
我当前的实现仅使用活页夹来识别操作类型、携带一些自定义数据并在回退方法中抛出异常。实际绑定在 DynamicMetaObject 中完成。
有没有关于 DLR 世界的发展方向的建议?
何时创建 DynamicMetaObject?
每次IDynamicMetaObjectProvider
需要绑定时,我看到的每一次执行都会创建 DynamicMetaObject 子类的新实例并返回它。这对我来说似乎有点奇怪。例如,我用我的语言对 Int32 进行了包装,当我执行如下操作时:
1+1
1+1
创建了 6 个新的 DynamicMetaObjects - 每个操作数一个,每个结果一个。在我的例子中,只有一个具有相同值的 int 实例(在此示例中,只有一个值 1 的 int 包装器实例),因此拥有 4 个 DynamicMetaObject 实例似乎不正确。
有没有办法DynamicMetaObject
总是对同一个实例使用相同的?我尝试创建一次 DynamicMetaObject 然后在GetMetaObject
方法中返回相同的实例,但我得到的只是一个错误An IDynamicMetaObjectProvider created invalid DynamicMetaObject instance.
另外,DynamicMetaObject 构造函数中的 BindingRestriction 参数在创建子类时似乎没有效果(我希望 DLR 会根据绑定限制缓存 DynamicMetaObject 的实例)。例如,有没有办法缓存 MO(或者,理想情况下用于类型)?