写更短的访问

时间:2016-05-24 10:38:16

标签: rascal

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

list[str] nodeNames = [];

visit (ast) {
  case someNode(str name): {
    nodeNames += name;
  }
};

1 个答案:

答案 0 :(得分:5)

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

[name | /someNode(str name) := ast];

你在这里看到

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

整体效果与使用访问的配方相同:来自name的所有someNode字段都会被收集并放入列表中。这是解决问题的最短解决方案。