如何用其他树替换子树?

时间:2013-01-22 19:07:52

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

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

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

有了类似的东西,我可以用一些其他方法调用替换某些方法的调用。

这样的事情可能吗?

2 个答案:

答案 0 :(得分:2)

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

要同时完成工作,您可以扩展Transformer,覆盖其transform方法,然后根据您感兴趣的具体树木进行模式匹配。致电super.transform以递归方式替换子树。

答案 1 :(得分:1)

有可能???最终

一般概念是“持久数据结构”。那些尽可能“坚持”新版本中原始价值的那些。

对于树木,“拉链”概念是适用的。它允许您导航到图形结构,同时保持一个数据结构,允许重建一个新值,该值最大限度地与您用于创建新变体的更改共享。

检查出来。可以找到许多引用,以及包括ScalaZ在内的实现。