写更短的访问

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 字段都被收集并放在一个列表中。这是您问题的最短可能解决方案。