Scala 如何用其他树替换子树?

Scala 如何用其他树替换子树?,scala,macros,abstract-syntax-tree,scala-macros,Scala,Macros,Abstract Syntax Tree,Scala Macros,在Scala宏中,我想执行以下操作: 我有一棵树(可能很大)。现在我想找到这棵树的一个子树,它有一些具体的形式,例如,Apply(,)。现在我想创建一个新的树,它是原始树的副本,但是找到的子树被其他树替换了 使用类似的方法,例如,我可以用其他方法的调用替换某些方法的调用 这样的事情可能吗?可能吗???肯定是是 一般的概念是“持久化数据结构”,即那些尽可能“持久化”新变体中原始值的数据结构 说到树,“拉链”的概念是适用的。它允许您导航到图形结构中,同时维护一个数据结构,该数据结构允许重建一个新值,

在Scala宏中,我想执行以下操作:

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

使用类似的方法,例如,我可以用其他方法的调用替换某些方法的调用


这样的事情可能吗?

可能吗???肯定是是

一般的概念是“持久化数据结构”,即那些尽可能“持久化”新变体中原始值的数据结构

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


看看吧。可以找到许多参考资料和实现,包括ScalaZ。

我非常有兴趣看到树转换的替代方法,但是,它们还没有出现(实际上我们正在这方面进行调查)


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

谢谢,我看到了
Transformer
,但是包名中的
internal
这个词把我吓跑了。实现是内部的,是的,但是接口是公共的:。@EugeneBurmako从那以后在这方面有什么新的吗?我不知道如何查找和替换树的子树。好的,我知道调用
super.transform
递归地遍历树。没有在任何地方看到记录。