【问题标题】:How to replace a subtree with some other tree?如何用其他树替换子树?
【发布时间】:2013-01-22 19:07:52
【问题描述】:

在 Scala 宏中,我想做这样的事情:

我有一个Tree(可能很大)。现在我想找到这棵树的一个子树,它有一些具体的形式,例如Apply(_, _)。现在我想创建一个新树,它是原始树的副本,但找到的子树被其他树替换。

有了这样的东西,例如,我可以用调用其他方法来替换调用某个方法。

这样的事情可能吗?

【问题讨论】:

    标签: scala macros abstract-syntax-tree scala-macros


    【解决方案1】:

    我对看到树转换的替代方法非常感兴趣,但是,它们还没有问世(实际上我们正在这个方向进行调查)。

    为了同时完成任务,您可以扩展Transformer,覆盖其transform 方法,然后针对您感兴趣的具体树形式进行模式匹配。调用super.transform 以递归替换子树。

    【讨论】:

    • 谢谢,我看到了Transformer,但是包名中的internal这个词把我吓跑了。
    • 实现是内部的,是的,但接口是公共的:github.com/scalamacros/kepler/blob/…
    • @EugeneBurmako 从那以后在这方面有什么新的吗?我不知道如何找到并替换树的子树。
    • 好的,我 figured out 调用 super.transform 递归遍历树。没有看到它记录在任何地方。
    【解决方案2】:

    有可能吗???绝对是的

    一般概念是“持久数据结构”。那些在新变体中尽可能“保留”原始值的那些。

    对于树木,“拉链”概念是适用的。它使您可以导航到图形结构,同时维护一个数据结构,该结构允许重建一个新值,该值最大程度地与原始模数共享您为创建新变体而应用的更改。

    检查一下。可以找到许多参考资料以及实现,包括 ScalaZ。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多