code: func (expr *Expr) Copy() *Expr {
  
  	cpy := *expr
  
  	switch ts := expr.Terms.(type) {
  	case []*Term:
  		cpyTs := make([]*Term, len(ts))
  		for i := range ts {
  			cpyTs[i] = ts[i].Copy()
  		}
  		cpy.Terms = cpyTs
  	case *Term:
  		cpy.Terms = ts.Copy()
  	}
  
  	cpy.With = make([]*With, len(expr.With))
  	for i := range expr.With {
  		cpy.With[i] = expr.With[i].Copy()
  	}
  
  	return &cpy
  }
docs: // Copy returns a deep copy of expr.