在Rascal中,列表理解错误“ set [Declaration]不支持下标”

时间:2019-02-25 08:07:21

标签: 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);
}

1 个答案:

答案 0 :(得分:1)

答案是下标运算符是在地图和关系上定义的,而不是在集合上定义的。例如,在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都保留在内存中,那将会很有帮助。