如何避免Rascal中模块之间的名称冲突?

day*_*day 5 rascal

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

Jur*_*nju 4

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

长答案有三层:

  1. extend机制(与 相对import)将支持将来在扩展时间重命名。
  2. 当两个名称冲突时,即由于import使用相同名称的两个模块而存在歧义时,该名称将在当前模块的使用位置进行限定。类型检查器会建议一些适当的内容(当它被发布时)。
    • 例如,在这个不明确的代码中:(int a = f;假设 f 是从模块 A 和模块 B 导入的),您应该编写:int a = A::fint a = B::f来解决歧义。
  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;来自另一个模块)。