Я написал ниже код Rascal, который должен построить дерево из карты от имен узлов до узлов, начиная с узла, отображаемого с вершины. Он должен многократно заменять дочерние узлы всех узлов, которые имеют строки в виде дочерних элементов в result
узлами nodeMap
, сопоставляет их, пока ничего не изменится (fixpoint).Что именно делает внешняя стратегия посещения в Rascal?
getNode
возвращает узел map[str,node]
, который отображает его или сам ключ, если он отсутствует в качестве ключа на карте. Это прекрасно работает, так как доказывает тот факт, что другой код в нижней части этого вопроса действительно работает. Тем не менее, код непосредственно ниже, кажется, работает мгновенно даже на очень небольших входах.
node nodeMapToNode(map[str, node] nodeMap) {
node result = nodeMap["top"];
return outermost visit(result) {
case node n: {
if ([*str children] := getChildren(n)) {
insert makeNode(getName(n), [getNode(child, nodeMap) | child <- children]);
}
}
}
}
Следующий код действительно работает и мгновенно возвращается на небольшие входы, как я ожидал. Это, однако, именно то, что я понимал, что внешнее посещение должно делать из того, что я понял у наставника-мошенника.
Может кто-нибудь объяснить мне, какая разница между этими фрагментами кода (помимо того, как они написаны) и тем, что я таким образом неправильно понял о влиянии outermost visit
? Кроме того, я хотел бы знать, существует ли более короткий и/или более удобный способ написать этот код - используя что-то вроде внешнего посещения, вместо написания контрольной точки вручную.
node nodeMapToNode(map[str, node] nodeMap) {
node result = nodeMap["top"];
node lastResult;
do {
lastResult = result;
result = visit(lastResult) {
case node n: {
if ([*str children] := getChildren(n)) {
insert makeNode(getName(n),
[getNode(child, nodeMap) | child <- children]);
}
}
}
} while (result != lastResult);
return result;
}
Чтобы избежать людей, не обладающих слишком большим знанием о негодяи, которые могут увидеть ответ с достаточной информацией, нужно будет найти его, вот определение «самой внешней» стратегии посещения от наставника-мошенника: «повторите нисходящий обход пока обход изменит результирующее значение (вычислите фиксированную точку) ». –