更新不可变AST的最简单方法是什么?

jes*_*slg 5 macros scala abstract-syntax-tree scala-2.10

在使用宏时,我已经达到了这一点(我一直在努力避免它),我需要在AST中更新那些具有特定条件的节点.例如,假设我想更新每个节点:

Literal(Constant(1))
Run Code Online (Sandbox Code Playgroud)

价值:

Literal(Constant(2))
Run Code Online (Sandbox Code Playgroud)

那些AST节点可以在表达式树中的任何位置,因此我不能使用ad-hoc模式匹配器.显然,我想做的最后一件事是编写一个完整的模式匹配器,它能够覆盖所有的编译器原语.我一直在API中搜索,但我的印象是诸如collect遍历族之类的方法不足以满足我的需求,因为它们将树视为线性的东西,我希望整个更新的树作为结果.那么,是否可以以智能方式更新不可变表达式树?为什么在标准API中不存在这样的"更新"操作?