在Scala宏中,我想做这样的事情:
我有Tree
(可能很大)。现在我想找到一个具有某种具体形式的树的子树,例如Apply(_, _)
。现在我想创建一个新树,它是原始树的副本,但找到的子树被其他树替换。
有了类似的东西,我可以用一些其他方法调用替换某些方法的调用。
这样的事情可能吗?
答案 0 :(得分:2)
我非常有兴趣看到树转换的替代方法,但是,它们还没有到达(我们实际上正在朝这个方向进行调查)。
要同时完成工作,您可以扩展Transformer
,覆盖其transform
方法,然后根据您感兴趣的具体树木进行模式匹配。致电super.transform
以递归方式替换子树。
答案 1 :(得分:1)
有可能???最终是!
一般概念是“持久数据结构”。那些尽可能“坚持”新版本中原始价值的那些。
对于树木,“拉链”概念是适用的。它允许您导航到图形结构,同时保持一个数据结构,允许重建一个新值,该值最大限度地与您用于创建新变体的更改共享。
检查出来。可以找到许多引用,以及包括ScalaZ在内的实现。