如何在Rascal中的模块之间取消名称冲突?

时间:2013-10-24 22:55:56

标签: rascal

如何避免模块之间的名称冲突?从文档中可以看出,目前Rascal中的模块之间没有原则名称管理。导入模块时,导入模块中声明为public的所有名称都将进入范围。有合格的进口方式吗?或者会有吗?

1 个答案:

答案 0 :(得分:3)

再次提出好问题:-)简短的回答是,您在两次导入相同名称的模块中的使用地点限定名称。

答案很长很多:

  1. extend机制(与import相对)将支持将来在扩展时重命名。
  2. 当两个名称冲突时,由于import两个使用相同名称的模块存在歧义,该名称将在当前模块的使用站点进行限定。类型检查器将建议适当的东西(当它被释放时)。
    • 例如,在这个模棱两可的代码中:int a = f;(想象f是从模块A和模块B导入的),你应该写:int a = A::fint a = B::f来解决模糊性。< / LI>
  3. 对于非重叠函数,代数数据类型和语法非终端冲突不存在,它们被合并。
    • 例如:来自一个模块的data A = a();data A = b()合并,语法syntax Exp = Exp "+" Exp;的相同内容与syntax Exp = Exp "*" Exp;合并,并且对于函数:int f(int i) = 1;已合并与int f(real r) = 1;
    • 在该注释中,您仍然可以使用以下方法之一引用其中一个备选方案:A::f(1)以防止使用合并版本。
    • 当参数模式不相互排斥时,重叠函数仍然需要消除歧义(例如:int f(int i) = 1;来自一个模块int f(value x) = 2;来自另一模块。