Object* SubstituteExpression::walkApply(const Apply* pattern) { Apply* ret = new Apply; Apply::const_iterator it=pattern->firstValue(), itEnd=pattern->constEnd(); ret->ulimit()=walk(pattern->ulimit()); ret->dlimit()=walk(pattern->dlimit()); ret->domain()=walk(pattern->domain()); PushValue<QStringList> v(m_bvars, m_bvars); QVector<Ci*> bvars = pattern->bvarCi(); foreach(Ci* bvar, bvars) { Ci* nbvar = bvar->copy(); const QString name = bvar->name(); const Object* val = m_values.value(bvar->name()); if(val && !m_renames.contains(name)) { Q_ASSERT(val->type()==Object::variable); QString newname = static_cast<const Ci*>(val)->name(); m_renames.insert(name, newname); } nbvar->setName(solveRename(name)); ret->addBVar(nbvar); m_bvars.append(nbvar->name()); }