If statements

This commit is contained in:
Chuck Smith
2024-01-19 15:46:10 -05:00
parent ea1ae5cfb0
commit e6d5567681
2 changed files with 68 additions and 0 deletions

View File

@@ -21,18 +21,28 @@ func Eval(node ast.Node) object.Object {
case *ast.ExpressionStatement:
return Eval(node.Expression)
case *ast.BlockStatement:
return evalStatements(node.Statements)
case *ast.IfExpression:
return evalIfExpression(node)
// Expressions
case *ast.IntegerLiteral:
return &object.Integer{Value: node.Value}
case *ast.Boolean:
return nativeBoolToBooleanObject(node.Value)
case *ast.PrefixExpression:
right := Eval(node.Right)
return evalPrefixExpression(node.Operator, right)
case *ast.InfixExpression:
left := Eval(node.Left)
right := Eval(node.Right)
return evalInfixExpression(node.Operator, left, right)
}
return nil
@@ -126,3 +136,28 @@ func evalIntegerInfixExpression(operator string, left, right object.Object) obje
return NULL
}
}
func evalIfExpression(ie *ast.IfExpression) object.Object {
condition := Eval(ie.Condition)
if isTruthy(condition) {
return Eval(ie.Consequence)
} else if ie.Alternative != nil {
return Eval(ie.Alternative)
} else {
return NULL
}
}
func isTruthy(obj object.Object) bool {
switch obj {
case NULL:
return false
case TRUE:
return true
case FALSE:
return false
default:
return true
}
}