Rascal 中的列表理解错误 "subscript not supported on set[Declaration]"
Error "subscript not supported on set[Declaration]" for list comprehension in Rascal
我不明白为什么我会收到当前在 Rascal 中遇到的错误。
|cwd:///loader.rsc|(391,1,<19,33>,<19,34>): subscript not supported on set[Declaration] at |cwd:///loader.rsc|(391,1,<19,33>,<19,34>)
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UnsupportedOperation/UnsupportedOperation.html|
我在以下列表理解中得到了这个:
{asts[astIndexes[i]] | int i <- [0 .. size(astIndexes)]}
如果需要,这是整个文件:
module loader
import IO;
import Set;
import List;
import lang::java::m3::Core;
import lang::java::m3::AST;
import String;
set[Declaration] asts = {};
void getAsts(list[loc] partialScanList){
asts = {};
for (loc m <- partialScanList)
asts += createAstFromFile(m, true);
}
void scanMetric(void (set[Declaration]) metricFunction, list[int] astIndexes){
metricFunction({asts[astIndexes[i]] | int i <- [0 .. size(astIndexes)]});
println(0);
}
答案是下标运算符是在映射和关系上定义的,而不是在集合上定义的。例如,在 rel[int,int] x = {<1,2>}
上你可以 x[1]
得到 {2}
,在 map[int,int] y = (1:2)
上你可以 y[1]
得到 2
.
旁注,这段代码看起来像是它计算 AST 节点的查找索引,但 Rascal 已经为所有 ADT 构造函数树提供了非常有效的哈希,这些哈希用于在关系和映射中查找。由于这些哈希码也是整数并且它们的分布非常均匀,因此很难通过在此之上引入自己的索引方案来提高性能。它很可能会降低性能而不是提高性能。
所以如果你需要每个 AST 节点查找,你可以使用 rel[Declaration, Something else]
。人们还经常使用 loc
作为对 AST 节点的引用,因为它们应该是非常独特的。如果您不能始终将所有 AST 保存在内存中,这会有所帮助。
我不明白为什么我会收到当前在 Rascal 中遇到的错误。
|cwd:///loader.rsc|(391,1,<19,33>,<19,34>): subscript not supported on set[Declaration] at |cwd:///loader.rsc|(391,1,<19,33>,<19,34>)
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UnsupportedOperation/UnsupportedOperation.html|
我在以下列表理解中得到了这个:
{asts[astIndexes[i]] | int i <- [0 .. size(astIndexes)]}
如果需要,这是整个文件:
module loader
import IO;
import Set;
import List;
import lang::java::m3::Core;
import lang::java::m3::AST;
import String;
set[Declaration] asts = {};
void getAsts(list[loc] partialScanList){
asts = {};
for (loc m <- partialScanList)
asts += createAstFromFile(m, true);
}
void scanMetric(void (set[Declaration]) metricFunction, list[int] astIndexes){
metricFunction({asts[astIndexes[i]] | int i <- [0 .. size(astIndexes)]});
println(0);
}
答案是下标运算符是在映射和关系上定义的,而不是在集合上定义的。例如,在 rel[int,int] x = {<1,2>}
上你可以 x[1]
得到 {2}
,在 map[int,int] y = (1:2)
上你可以 y[1]
得到 2
.
旁注,这段代码看起来像是它计算 AST 节点的查找索引,但 Rascal 已经为所有 ADT 构造函数树提供了非常有效的哈希,这些哈希用于在关系和映射中查找。由于这些哈希码也是整数并且它们的分布非常均匀,因此很难通过在此之上引入自己的索引方案来提高性能。它很可能会降低性能而不是提高性能。
所以如果你需要每个 AST 节点查找,你可以使用 rel[Declaration, Something else]
。人们还经常使用 loc
作为对 AST 节点的引用,因为它们应该是非常独特的。如果您不能始终将所有 AST 保存在内存中,这会有所帮助。