在 Scala 宏中,我想做这样的事情:
我有一个Tree
(可能很大)。现在我想找到这棵树的一个具有某种具体形式的子树,例如Apply(_, _)
. 现在我想创建一个新树,它是原始树的副本,但是找到的子树被其他树替换。
有了这样的东西,我可以例如用调用一些其他方法来替换调用一些方法。
这样的事情可能吗?
在 Scala 宏中,我想做这样的事情:
我有一个Tree
(可能很大)。现在我想找到这棵树的一个具有某种具体形式的子树,例如Apply(_, _)
. 现在我想创建一个新树,它是原始树的副本,但是找到的子树被其他树替换。
有了这样的东西,我可以例如用调用一些其他方法来替换调用一些方法。
这样的事情可能吗?
我对看到树转换的替代方法非常感兴趣,但是,它们还没有出现(实际上我们在这个方向上正在进行调查)。
为了同时完成任务,您可以扩展Transformer
、覆盖其transform
方法,然后针对您感兴趣的树的具体形式进行模式匹配。调用super.transform
以递归替换子树。
是否可以???绝对是的!
一般概念是“持久数据结构”。那些在新变体中尽可能“保留”原始价值的人。
说到树木,“拉链”的概念是适用的。它使您可以导航到图形结构,同时维护允许重建新值的数据结构,该新值与原始模数最大程度地共享您为创建新变体而应用的更改。
看看这个。可以找到许多参考资料以及实现,包括 ScalaZ。