|
|
@@ -25,6 +25,9 @@ func Eval(node ast.Node) object.Object {
|
|
|
return &object.Integer{Value: node.Value}
|
|
|
case *ast.Boolean:
|
|
|
return nativeBooleanObject(node.Value)
|
|
|
+ case *ast.PrefixExpression:
|
|
|
+ right := Eval(node.Right)
|
|
|
+ return evalPrefixExpression(node.Operator, right)
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
@@ -46,3 +49,33 @@ func nativeBooleanObject(input bool) *object.Boolean {
|
|
|
return FALSE
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func evalPrefixExpression(operator string, right object.Object) object.Object {
|
|
|
+ switch operator {
|
|
|
+ case "!":
|
|
|
+ return evalBangOperatorExpression(right)
|
|
|
+ case "-":
|
|
|
+ return evalMinusPreOperatorExpression(right)
|
|
|
+ default:
|
|
|
+ return NULL
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func evalMinusPreOperatorExpression(right object.Object) object.Object {
|
|
|
+ if right.Type() != object.IntegerObj {
|
|
|
+ return NULL
|
|
|
+ }
|
|
|
+ value := right.(*object.Integer).Value
|
|
|
+ return &object.Integer{Value: -value}
|
|
|
+}
|
|
|
+
|
|
|
+func evalBangOperatorExpression(right object.Object) object.Object {
|
|
|
+ switch right {
|
|
|
+ case TRUE:
|
|
|
+ return FALSE
|
|
|
+ case FALSE:
|
|
|
+ return TRUE
|
|
|
+ default:
|
|
|
+ return FALSE
|
|
|
+ }
|
|
|
+}
|