Пример #1
0
 void VariableScope::removeId(int id)
 {
     if (id >= 0 && id < (int)scope->size() && (*scope)[id])
     {
         removeChildFromParent((*scope)[id]);
         removeDependencies((*scope)[id]);
         (*scope)[id] = 0;
         freePlaces->push(id);
     }
 }
Пример #2
0
Expression Analitza::evaluate()
{
	if(m_exp.isCorrect()) {
		Expression e(m_exp); //FIXME: That's a strange trick, wouldn't have to copy
		e.m_tree=removeDependencies(e.m_tree);
		e.m_tree=simp(e.m_tree);
		e.m_tree=eval(e.m_tree);
		e.m_tree=simp(e.m_tree);
		return e;
	} else {
		m_err << i18n("Must specify an operation");
		return Expression();
	}
}
Пример #3
0
Object* Analitza::removeDependencies(Object * o) const
{
	Q_ASSERT(o);
	if(o->type()==Object::variable) {
		Ci* var=(Ci*) o;
		qDebug() << "Wanna remove" << var->name() << m_vars->value(var->name());
		if(m_vars->contains(var->name()) && m_vars->value(var->name())) {
			Object *value=Expression::objectCopy(m_vars->value(var->name()));
			Object *no = removeDependencies(value);
			delete o;
			return no;
		}
	} else if(o->type()==Object::container) {
		Container *c = (Container*) o;
		Operator op(c->firstOperator());
		if(c->containerType()==Object::apply && op.isBounded()) { //it is a function
			Container *cbody = c;
			QStringList bvars;
			if(op.operatorType()==Object::function) {
				Ci *func= (Ci*) c->m_params[0];
				Object* body= (Object*) m_vars->value(func->name());
				if(body->type()!=Object::container)
					return body;
				cbody = (Container*) body;
			}
			
			bvars = cbody->bvarList();
			qDebug() << bvars;
			
			if(op.operatorType()==Object::function) {
				QStringList::const_iterator iBvars(bvars.constBegin());
				int i=0;
				for(; iBvars!=bvars.constEnd(); ++iBvars)
					m_vars->stack(*iBvars, c->m_params[++i]);
				delete c;
			}
			
			QList<Object*>::iterator fval(cbody->firstValue());
			qDebug() << "removing: " << (*fval)->toString();
			Object *ret= removeDependencies(Expression::objectCopy(*fval));
			
			QStringList::const_iterator iBvars(bvars.constBegin());
			for(; iBvars!=bvars.constEnd(); ++iBvars)
				m_vars->destroy(*iBvars);
			
			
			if(op.operatorType()==Object::function)
				return ret;
			else {
				delete *fval;
				*fval=ret;
				return c;
			}
		} else {
			QList<Object*>::iterator it(c->m_params.begin());
			for(; it!=c->m_params.end(); ++it)
				*it = removeDependencies(*it);
		}
	}
	return o;
}