Value* NumberValue::operation(Value& v, Expression::Operator_e e) { NumberValue* num = dynamic_cast<NumberValue*>(&v); if(num) { if(isComparison(e)) { bool result=basicOperation<bool,double>(this->number,e,num->number); return new BooleanValue(result); } else { double result=basicOperation<double,double>(this->number,e,num->number); return new NumberValue(result); } } VectorValue* vec = dynamic_cast<VectorValue*>(&v); if(vec) { if(e==Expression::Concatenate) { QList<Value*> r=vec->getChildren(); r.prepend(this); return new VectorValue(r); } else { //operations between scalars and vectors are commutative e.g. // [1,2,3]-1 is the same as 1 - [1,2,3] return Value::operation(vec,e,this); } } return Value::operation(v,e); }