Simplified Equality
Some checks failed
Build / build (push) Successful in 10m48s
Test / build (push) Failing after 17m11s

This commit is contained in:
Chuck Smith
2024-03-24 17:11:48 -04:00
parent fea9fb9f64
commit 1c99d2198b
11 changed files with 109 additions and 133 deletions

View File

@@ -337,6 +337,7 @@ func evalInfixExpression(operator string, left, right object.Object) object.Obje
elements = append(elements, leftVal...)
}
return &object.Array{Elements: elements}
// 3 * [1]
case operator == "*" && left.Type() == object.INTEGER_OBJ && right.Type() == object.ARRAY_OBJ:
leftVal := int(left.(*object.Integer).Value)
@@ -352,24 +353,33 @@ func evalInfixExpression(operator string, left, right object.Object) object.Obje
leftVal := left.(*object.String).Value
rightVal := right.(*object.Integer).Value
return &object.String{Value: strings.Repeat(leftVal, int(rightVal))}
// 4 * " "
case operator == "*" && left.Type() == object.INTEGER_OBJ && right.Type() == object.STRING_OBJ:
leftVal := left.(*object.Integer).Value
rightVal := right.(*object.String).Value
return &object.String{Value: strings.Repeat(rightVal, int(leftVal))}
case operator == "==":
return nativeBoolToBooleanObject(left.(object.Comparable).Compare(right) == 0)
case operator == "!=":
return nativeBoolToBooleanObject(left.(object.Comparable).Compare(right) != 0)
case operator == "<=":
return nativeBoolToBooleanObject(left.(object.Comparable).Compare(right) < 1)
case operator == ">=":
return nativeBoolToBooleanObject(left.(object.Comparable).Compare(right) > -1)
case operator == "<":
return nativeBoolToBooleanObject(left.(object.Comparable).Compare(right) == -1)
case operator == ">":
return nativeBoolToBooleanObject(left.(object.Comparable).Compare(right) == 1)
case left.Type() == object.BOOLEAN_OBJ && right.Type() == object.BOOLEAN_OBJ:
return evalBooleanInfixExpression(operator, left, right)
case left.Type() == object.INTEGER_OBJ && right.Type() == object.INTEGER_OBJ:
return evalIntegerInfixExpression(operator, left, right)
case left.Type() == object.STRING_OBJ && right.Type() == object.STRING_OBJ:
return evalStringInfixExpression(operator, left, right)
case operator == "==":
return nativeBoolToBooleanObject(left == right)
case operator == "!=":
return nativeBoolToBooleanObject(left != right)
case left.Type() != right.Type():
return newError("type mismatch: %s %s %s", left.Type(), operator, right.Type())
default:
return newError("unknown operator: %s %s %s", left.Type(), operator, right.Type())
}
@@ -380,10 +390,6 @@ func evalBooleanInfixExpression(operator string, left, right object.Object) obje
rightVal := right.(*object.Boolean).Value
switch operator {
case "==":
return nativeBoolToBooleanObject(left == right)
case "!=":
return nativeBoolToBooleanObject(leftVal != rightVal)
case "&&":
return &object.Boolean{Value: leftVal && rightVal}
case "||":
@@ -400,14 +406,6 @@ func evalStringInfixExpression(operator string, left object.Object, right object
switch operator {
case "+":
return &object.String{Value: leftVal + rightVal}
case "<":
return nativeBoolToBooleanObject(leftVal < rightVal)
case ">":
return nativeBoolToBooleanObject(leftVal > rightVal)
case "==":
return nativeBoolToBooleanObject(leftVal == rightVal)
case "!=":
return nativeBoolToBooleanObject(leftVal != rightVal)
default:
return newError("unknown operator: %s %s %s", left.Type(), operator, right.Type())
}

View File

@@ -118,6 +118,7 @@ func TestIfElseExpression(t *testing.T) {
}
for _, tt := range tests {
t.Log(tt.input)
evaluated := testEval(tt.input)
integer, ok := tt.expected.(int)
if ok {
@@ -184,11 +185,11 @@ func TestErrorHandling(t *testing.T) {
}{
{
"5 + true;",
"type mismatch: int + bool",
"unknown operator: int + bool",
},
{
"5 + true; 5;",
"type mismatch: int + bool",
"unknown operator: int + bool",
},
{
"-true",