如何避免模块之间的名称冲突?从文档来看,目前 Rascal 中的模块之间似乎没有原则上的名称管理。导入模块时,导入模块中声明的所有名称public
都进入范围。有没有办法合格进口?还是会有?
问问题
104 次
1 回答
4
又是一个好问题 :-) 简短的回答是,您在模块中的使用站点上限定了两次导入相同名称的名称。
长答案是三方面的:
- 该
extend
机制(相对于import
)将支持将来在扩展时重命名。 import
当两个名称冲突时,在由于两个模块使用相同名称而存在歧义的意义上,该名称将在当前模块中的使用站点进行限定。类型检查器会建议一些合适的东西(当它发布时)。- 例如,在这个模棱两可的代码中:(
int a = f;
假设 f 是从模块 A 和模块 B 中导入的),你应该写:int a = A::f
orint a = B::f
来解决模棱两可的问题。
- 例如,在这个模棱两可的代码中:(
- 对于非重叠函数,代数数据类型和语法非终结符不存在冲突,它们被合并。
- 例如:
data A = a();
from one module 与 合并data A = b()
,same for 语法syntax Exp = Exp "+" Exp;
与syntax Exp = Exp "*" Exp;
and 对于函数:int f(int i) = 1;
与 合并int f(real r) = 1;
。 - 在那一点上,您仍然可以使用以下方法引用其中一种替代方法:
A::f(1)
以防止使用合并版本。 - 当参数模式不是互斥的(例如:
int f(int i) = 1;
来自一个模块与int f(value x) = 2;
来自另一个模块)时,重叠功能仍然需要消除歧义。
- 例如:
于 2013-10-25T05:16:36.330 回答