【发布时间】:2015-08-18 06:50:33
【问题描述】:
如果我有:
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 合并的分叉版本)从 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 在容易声明的变量的情况下检查结果是否等于环境中的值。
谢谢!
【问题讨论】:
-
你能提供你提到的其他案例的例子吗?
-
另一种情况是关于拥有例如
`{Param ","}* paramDups {Param ","} paramDups`在语法中。这可能会引发异常或像上面的示例一样表现错误(我正在修复我的分叉 Rascal 版本,所以我不是 100% 确定)。然而,我很好奇的是,为什么具体模式中的变量不支持变量重用,而非具体模式中的变量支持变量重用(例如numb(x), numb(x)-example),正如您在回答中所说的那样应该抛出一个RedeclaredVariable-exception。
标签: rascal