예제 #1
0
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;
}
예제 #2
0
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);
}