【发布时间】:2013-01-22 19:07:52
【问题描述】:
在 Scala 宏中,我想做这样的事情:
我有一个Tree(可能很大)。现在我想找到这棵树的一个子树,它有一些具体的形式,例如Apply(_, _)。现在我想创建一个新树,它是原始树的副本,但找到的子树被其他树替换。
有了这样的东西,例如,我可以用调用其他方法来替换调用某个方法。
这样的事情可能吗?
【问题讨论】:
标签: scala macros abstract-syntax-tree scala-macros
在 Scala 宏中,我想做这样的事情:
我有一个Tree(可能很大)。现在我想找到这棵树的一个子树,它有一些具体的形式,例如Apply(_, _)。现在我想创建一个新树,它是原始树的副本,但找到的子树被其他树替换。
有了这样的东西,例如,我可以用调用其他方法来替换调用某个方法。
这样的事情可能吗?
【问题讨论】:
标签: scala macros abstract-syntax-tree scala-macros
我对看到树转换的替代方法非常感兴趣,但是,它们还没有问世(实际上我们正在这个方向进行调查)。
为了同时完成任务,您可以扩展Transformer,覆盖其transform 方法,然后针对您感兴趣的具体树形式进行模式匹配。调用super.transform 以递归替换子树。
【讨论】:
Transformer,但是包名中的internal这个词把我吓跑了。
super.transform 递归遍历树。没有看到它记录在任何地方。
有可能吗???绝对是的!
一般概念是“持久数据结构”。那些在新变体中尽可能“保留”原始值的那些。
对于树木,“拉链”概念是适用的。它使您可以导航到图形结构,同时维护一个数据结构,该结构允许重建一个新值,该值最大程度地与原始模数共享您为创建新变体而应用的更改。
检查一下。可以找到许多参考资料以及实现,包括 ScalaZ。
【讨论】: