写更短的访问
Write even shorter visits
是否可以使用列表理解或类似的方法将这样的访问重写为一行?
list[str] nodeNames = [];
visit (ast) {
case someNode(str name): {
nodeNames += name;
}
};
是的,您可以使用我们所说的 后代匹配 运算符 /
:
[name | /someNode(str name) := ast];
你看这里
[
和 ]
之间的列表理解。
- 左边是模式,右边是主题的匹配运算符
:=
。
- 后代模式
/someNode(str name)
将匹配 someNode(str name)
形式的每个子节点并将绑定模式变量 name
.
整体效果与您使用访问的公式相同:来自 someNode
的所有 name
字段都被收集并放在一个列表中。这是您问题的最短可能解决方案。
是否可以使用列表理解或类似的方法将这样的访问重写为一行?
list[str] nodeNames = [];
visit (ast) {
case someNode(str name): {
nodeNames += name;
}
};
是的,您可以使用我们所说的 后代匹配 运算符 /
:
[name | /someNode(str name) := ast];
你看这里
[
和]
之间的列表理解。- 左边是模式,右边是主题的匹配运算符
:=
。 - 后代模式
/someNode(str name)
将匹配someNode(str name)
形式的每个子节点并将绑定模式变量name
.
整体效果与您使用访问的公式相同:来自 someNode
的所有 name
字段都被收集并放在一个列表中。这是您问题的最短可能解决方案。