diff options
Diffstat (limited to 'evaluator/evaluator.go')
| -rw-r--r-- | evaluator/evaluator.go | 19 |
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 } |
