Ошибка «индекс не поддерживается на множестве [Объявление]» для понимания списка в Rascal - PullRequest
0 голосов
/ 25 февраля 2019

Я не понимаю, почему я получаю ошибку, которую я сейчас получаю в 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 голосов
/ 25 февраля 2019

Ответ заключается в том, что оператор индекса определяется на картах и ​​отношениях, а не на множествах.Например, на 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 в памяти.

...