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