如何在scala中制作抽象语法树的深层副本?

如何在scala中制作抽象语法树的深层副本?,scala,abstract-syntax-tree,Scala,Abstract Syntax Tree,ast是使用case类及其大量嵌套编写的。解析后,我希望得到它的深层副本,并独立地操作副本。就像@AlexeyRomanov所说的,您可以自己编写递归副本函数 一个小例子: trait A case class B(a0: A, a1: A) extends A case class C(value: Int) extends A def copy(a: A): A = a match { case B(a0, a1) => B(copy(a0), copy(a1)) case

ast是使用case类及其大量嵌套编写的。解析后,我希望得到它的深层副本,并独立地操作副本。

就像@AlexeyRomanov所说的,您可以自己编写递归副本函数

一个小例子:

trait A
case class B(a0: A, a1: A) extends A
case class C(value: Int) extends A

def copy(a: A): A = a match {
  case B(a0, a1) => B(copy(a0), copy(a1))
  case C(value) => C(value)
}

val a = B(C(0), B(C(1), C(2)))
val aCopy = copy(a)

a == aCopy //true
a eq aCopy //false

如果它是不可变的,那么就没有必要进行深入的复制。顺便说一句,不清楚你在问什么。AST是自己写的还是从库中写的?@sschaef我不得不复制,因为有人比较
eq
@sschaef,它是我自己写的,事实上我需要一个深度复制。在这种情况下,最合理的方法就是添加一个递归生成深度复制的方法。