5

如何避免模块之间的名称冲突?从文档来看,目前 Rascal 中的模块之间似乎没有原则上的名称管理。导入模块时,导入模块中声明的所有名称public都进入范围。有没有办法合格进口?还是会有?

4

1 回答 1

4

又是一个好问题 :-) 简短的回答是,您在模块中的使用站点上限定了两次导入相同名称的名称。

长答案是三方面的:

  1. extend机制(相对于import)将支持将来在扩展时重命名。
  2. import当两个名称冲突时,在由于两个模块使用相同名称而存在歧义的意义上,该名称将在当前模块中的使用站点进行限定。类型检查器会建议一些合适的东西(当它发布时)。
    • 例如,在这个模棱两可的代码中:(int a = f;假设 f 是从模块 A 和模块 B 中导入的),你应该写:int a = A::forint a = B::f来解决模棱两可的问题。
  3. 对于非重叠函数,代数数据类型和语法非终结符不存在冲突,它们被合并。
    • 例如: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 回答