bitwise operators and boolean operators
This commit is contained in:
@@ -256,15 +256,22 @@ func nativeBoolToBooleanObject(input bool) object.Object {
|
||||
func evalPrefixExpression(operator string, right object.Object) object.Object {
|
||||
switch operator {
|
||||
case "!":
|
||||
return evalBangOperatorExpression(right)
|
||||
case "-":
|
||||
return evalMinusPrefixOperatorExpression(right)
|
||||
if right.Type() == object.BOOLEAN_OBJ {
|
||||
return evalBooleanPrefixOperatorExpression(operator, right)
|
||||
}
|
||||
return evalIntegerPrefixOperatorExpression(operator, right)
|
||||
case "~", "-":
|
||||
return evalIntegerPrefixOperatorExpression(operator, right)
|
||||
default:
|
||||
return newError("unknown operator: %s%s", operator, right.Type())
|
||||
}
|
||||
}
|
||||
|
||||
func evalBangOperatorExpression(right object.Object) object.Object {
|
||||
func evalBooleanPrefixOperatorExpression(operator string, right object.Object) object.Object {
|
||||
if right.Type() != object.BOOLEAN_OBJ {
|
||||
return newError("unknown operator: %s%s", operator, right.Type())
|
||||
}
|
||||
|
||||
switch right {
|
||||
case TRUE:
|
||||
return FALSE
|
||||
@@ -277,17 +284,28 @@ func evalBangOperatorExpression(right object.Object) object.Object {
|
||||
}
|
||||
}
|
||||
|
||||
func evalMinusPrefixOperatorExpression(right object.Object) object.Object {
|
||||
func evalIntegerPrefixOperatorExpression(operator string, right object.Object) object.Object {
|
||||
if right.Type() != object.INTEGER_OBJ {
|
||||
return newError("unknown operator: -%s", right.Type())
|
||||
}
|
||||
|
||||
value := right.(*object.Integer).Value
|
||||
return &object.Integer{Value: -value}
|
||||
switch operator {
|
||||
case "!":
|
||||
return FALSE
|
||||
case "~":
|
||||
return &object.Integer{Value: ^value}
|
||||
case "-":
|
||||
return &object.Integer{Value: -value}
|
||||
default:
|
||||
return newError("unknown operator: %s", operator)
|
||||
}
|
||||
}
|
||||
|
||||
func evalInfixExpression(operator string, left, right object.Object) object.Object {
|
||||
switch {
|
||||
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:
|
||||
@@ -303,6 +321,24 @@ func evalInfixExpression(operator string, left, right object.Object) object.Obje
|
||||
}
|
||||
}
|
||||
|
||||
func evalBooleanInfixExpression(operator string, left, right object.Object) object.Object {
|
||||
leftVal := left.(*object.Boolean).Value
|
||||
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 "||":
|
||||
return &object.Boolean{Value: leftVal || rightVal}
|
||||
default:
|
||||
return newError("unknown operator: %s %s %s", left.Type(), operator, right.Type())
|
||||
}
|
||||
}
|
||||
|
||||
func evalStringInfixExpression(operator string, left object.Object, right object.Object) object.Object {
|
||||
leftVal := left.(*object.String).Value
|
||||
rightVal := right.(*object.String).Value
|
||||
@@ -338,6 +374,12 @@ func evalIntegerInfixExpression(operator string, left, right object.Object) obje
|
||||
return &object.Integer{Value: leftVal / rightVal}
|
||||
case "%":
|
||||
return &object.Integer{Value: leftVal % rightVal}
|
||||
case "|":
|
||||
return &object.Integer{Value: leftVal | rightVal}
|
||||
case "^":
|
||||
return &object.Integer{Value: leftVal ^ rightVal}
|
||||
case "&":
|
||||
return &object.Integer{Value: leftVal & rightVal}
|
||||
case "<":
|
||||
return nativeBoolToBooleanObject(leftVal < rightVal)
|
||||
case "<=":
|
||||
|
||||
Reference in New Issue
Block a user