diff --git a/interpreter.c b/interpreter.c index a5b07a9..9513cb1 100644 --- a/interpreter.c +++ b/interpreter.c @@ -23,19 +23,44 @@ void* VisitGroupingExpression(Expr* expression) { Object* VisitBinaryExpression(Expr* expression) { Object* left = Evaluate(expression->expression.Binary.left); Object* right = Evaluate(expression->expression.Binary.right); + double computed_value; switch(expression->expression.Binary.op->type) { case Greater: + computed_value = left->value.number > right->value.number; + FreeObject(left); + FreeObject(right); + return CreateObject(&computed_value, TRUE); //return left > right; case Greater_Equal: + computed_value = left->value.number >= right->value.number; + FreeObject(left); + FreeObject(right); + return CreateObject(&computed_value, TRUE); //return left >= right; case Less: + computed_value = left->value.number < right->value.number; + FreeObject(left); + FreeObject(right); + return CreateObject(&computed_value, TRUE); //return left < right; case Less_Equal: + computed_value = left->value.number <= right->value.number; + FreeObject(left); + FreeObject(right); + return CreateObject(&computed_value, TRUE); //return left <= right; case Bang_Equal: + computed_value = !IsEqual(left, right); + FreeObject(left); + FreeObject(right); + return CreateObject(&computed_value, TRUE); //return !IsEqual(left, right); case Equal_Equal: + computed_value = IsEqual(left, right); + FreeObject(left); + FreeObject(right); + return CreateObject(&computed_value, TRUE); //return IsEqual(left, right); case Minus: left->value.number -= right->value.number; @@ -178,22 +203,21 @@ int ConcatStringObject(Object* a, const Object* b) { } int IsTruthy(Object* object) { - - if (!object || object->instance == NIL) return 0; - if (object->instance == TRUE) return 0; + if (!object || object->instance == INS_NULL) return 0; + if (object->instance == INS_BOOLEAN) return object->value.boolean; return 1; } int IsEqual(Object* a, Object* b) { - if (a->instance == NIL && b->instance == NIL) return 1; - if (a->instance == NIL) return 0; + if (a->instance == INS_NULL && b->instance == INS_NULL) return 1; + if (a->instance == INS_NULL) return 0; - if (b->instance == Number && b->instance == Number) { + if (b->instance == INS_DOUBLE && b->instance == INS_DOUBLE) { return a->value.number == b->value.number; } - if (a->instance == String && b->instance == String) { + if (a->instance == INS_STRING && b->instance == INS_STRING) { return strcmp(a->value.string, b->value.string) == 0; }