SCValue* Fraction_eval(SCFraction* self) { SCFraction* frac = Fraction_copy(self); Fraction_simplify(frac); SCValue* ret; if (frac->denominator == 1) { ret = ValInt(frac->numerator); Fraction_free(frac); } else { ret = ValFrac(frac); } return ret; }
void Value_free(Value* val) { if(!val) return; switch(val->type) { case VAL_EXPR: BinOp_free(val->expr); break; case VAL_UNARY: UnOp_free(val->term); break; case VAL_CALL: FuncCall_free(val->call); break; case VAL_FRAC: Fraction_free(val->frac); break; case VAL_VAR: free(val->name); break; case VAL_VEC: Vector_free(val->vec); break; case VAL_ERR: Error_free(val->err); break; default: /* The rest don't need to be freed */ break; } free(val); }