Simplified Equality
This commit is contained in:
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user