void Expr::append(const Expr& expr) { ListExpr* le = dynamic_cast<ListExpr*>(ptr().get()); if (le != 0) { le->append(expr); return; } else { if (ptr().get()==0) { Array<Expr> e(1); e[0] = expr; ptr() = rcp(new ListExpr(e)); } else { Array<Expr> e(2); e[0] = *this; e[1] = expr; ptr() = rcp(new ListExpr(e)); } } }