写更短的访问

Nic*_*sso 2 rascal

是否可以通过使用列表推导或类似的东西将这样的访问重写为单行?

list[str] nodeNames = [];

visit (ast) {
  case someNode(str name): {
    nodeNames += name;
  }
};
Run Code Online (Sandbox Code Playgroud)

小智 5

是的,您可以使用我们称之为后代匹配运算符的内容/:

[name | /someNode(str name) := ast];
Run Code Online (Sandbox Code Playgroud)

你看这里

  • [和之间的列表理解].
  • 匹配运算符:=,左侧是图案,右侧是主题.
  • 一个后代模式/someNode(str name),它将匹配表单的每个子节点,someNode(str name)并将绑定模式变量name.

整体效果与使用访问的配方相同:收集s中的所有name字段someNode并将其放入列表中.这是您的问题的最短解决方案.