如果我有:
import demo::lang::Exp::Concrete::WithLayout::Syntax;
if ((Exp)`<IntegerLiteral e> + <IntegerLiteral e>` := (Exp)`5 + 6`) {
println(e);
}
这将打印 6
。这是一个可能的错误还是一个设计决策,例如因为性能考虑?它当然不应该打印任何内容,因为 e
无法同时与 5
和 6
匹配。然而,这与 ADT 的匹配相反,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 插件开发(使用与最新版本的 Rascal 合并的 fork 版本)从 Rascal 源运行该示例,并使用官方 Eclipse 插件在两台计算机上运行该示例。然而,该插件在两台机器上都返回了以下内容:
|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
检查结果是否等于环境中的值(如果变量已轻松声明)。
谢谢!
最佳答案
这绝对是一个错误:变量 e
被声明两次(没有警告),匹配成功并打印到第二个 e
的绑定(bind)。
预期的行为是抛出 RedeclaredVariable
异常。
解决方法如下:
if ((Exp)`<IntegerLiteral e1> + <IntegerLiteral e2>` := (Exp)`5 + 6` && e1 == e2) {
println(e1);
}
关于rascal - Rascal 中的具体语法匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060197/