/* Arithmetic */ SCValue* Fraction_add(SCFraction* self, SCValue* other) { SCValue* ret; switch (other->type) { case kValueFraction: { SCNumber numerator = self->numerator * other->fraction->denominator + self->denominator * other->fraction->numerator; SCNumber denominator = self->denominator * other->fraction->denominator; ret = ValFrac(Fraction_new(numerator, denominator)); break; } case kValueInteger: { SCNumber numerator = self->numerator + other->integer * self->denominator; SCNumber denominator = self->denominator; ret = ValFrac(Fraction_new(numerator, denominator)); break; } case kValueReal: { ret = ValReal(Fraction_asReal(self) + other->real); break; } default: return ValErr(nonArithType(other->type)); break; } return ret; }
double Value_asReal(const Value* val) { double ret; switch(val->type) { case VAL_INT: ret = val->ival; break; case VAL_REAL: ret = val->rval; break; case VAL_FRAC: ret = Fraction_asReal(val->frac); break; default: /* Expression couldn't be evaluated, so it's not a number */ ret = NAN; break; } return ret; }