如果我有:
import demo::lang::Exp::Concrete::WithLayout::Syntax;
if ((Exp)`<IntegerLiteral e> + <IntegerLiteral e>` := (Exp)`5 + 6`) {
println(e);
}
这会打印6
。这是一个可能的错误或设计决定,例如出于性能考虑?它当然不能打印任何内容,因为e
无法与5
和6
匹配。然而,这与匹配ADT相反,其中被 捕获,即:
data ExpNum = numb(int n) | add(ExpNum e1, ExpNum e2);
if (add(numb(x), numb(x)) := add(numb(5), numb(6))) { println(x); }
在使用numb(5)
代替numb(6)
时会打印一个数字,但不会打印数字。
聚苯乙烯。我使用Eclipse Plug-in Development(使用与最新版本的Rascal合并的分叉版本)以及使用官方Eclipse插件的两台计算机上的Rascal源代码运行示例。但是,该插件在两台机器上都返回了以下内容:
|stdin:///|(4,46,<1,4>,<1,50>): Java compilation failed due to with classpath [/home/wouter/eclipse//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar]: package org.eclipse.imp.pdb.facts.type does not exist
我问的原因是,有些类似地,ConcreteListVariablePattern
会自动抛出RedeclaredVariable
- 异常而不检查匹配结果的值是否等于环境中的变量,与例如对比QualifiedNamePattern
,它检查结果是否等同于容易声明的变量的环境中的值。
谢谢!
答案 0 :(得分:2)
这绝对是一个错误:变量e
被声明两次(没有警告),匹配成功并打印到第二个e
的绑定。
预期的行为是抛出RedeclaredVariable
异常。
解决方法如下:
if ((Exp)`<IntegerLiteral e1> + <IntegerLiteral e2>` := (Exp)`5 + 6` && e1 == e2) {
println(e1);
}