aboutsummaryrefslogtreecommitdiff
path: root/evaluator/evaluator.go
diff options
context:
space:
mode:
Diffstat (limited to 'evaluator/evaluator.go')
-rw-r--r--evaluator/evaluator.go19
1 files changed, 17 insertions, 2 deletions
diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go
index 5d69e2b..479e244 100644
--- a/evaluator/evaluator.go
+++ b/evaluator/evaluator.go
@@ -7,7 +7,7 @@ import (
var (
NULL = &object.Null{}
- TRUE = &object.Boolean{Value: true}
+ TRUE = &object.Boolean{Value: true}
FALSE = &object.Boolean{Value: false}
)
@@ -31,7 +31,7 @@ func Eval(node ast.Node) object.Object {
case *ast.PrefixExpression:
right := Eval(node.Right)
return evalPrefixExpression(node.Operator, right)
-
+
case *ast.InfixExpression:
left := Eval(node.Left)
right := Eval(node.Right)
@@ -73,6 +73,10 @@ func evalInfixExpression(operator string, left, right object.Object) object.Obje
switch {
case left.Type() == object.INTEGER_OBJ && right.Type() == object.INTEGER_OBJ:
return evalIntegerInfixExpression(operator, left, right)
+ case operator == "==":
+ return nativeBoolToBooleanObject(left == right)
+ case operator == "!=":
+ return nativeBoolToBooleanObject(left != right)
default:
return NULL
}
@@ -112,7 +116,18 @@ func evalIntegerInfixExpression(operator string, left, right object.Object) obje
case "*":
return &object.Integer{Value: leftValue * rightValue}
case "/":
+ if rightValue == 0 {
+ return NULL
+ }
return &object.Integer{Value: leftValue / rightValue}
+ case "<":
+ return nativeBoolToBooleanObject(leftValue < rightValue)
+ case ">":
+ return nativeBoolToBooleanObject(leftValue > rightValue)
+ case "==":
+ return nativeBoolToBooleanObject(leftValue == rightValue)
+ case "!=":
+ return nativeBoolToBooleanObject(leftValue != rightValue)
default:
return NULL
}