Added overloaded support for str * int
Some checks failed
Build / build (push) Successful in 10m36s
Test / build (push) Failing after 15m43s

This commit is contained in:
Chuck Smith
2024-03-23 10:03:31 -04:00
parent 16ca2acf49
commit 803d717379
4 changed files with 30 additions and 1 deletions

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"monkey/ast"
"monkey/object"
"strings"
)
var (
@@ -304,6 +305,18 @@ func evalIntegerPrefixOperatorExpression(operator string, right object.Object) o
func evalInfixExpression(operator string, left, right object.Object) object.Object {
switch {
// " " * 4
case left.Type() == object.STRING_OBJ && right.Type() == object.INTEGER_OBJ:
leftVal := left.(*object.String).Value
rightVal := right.(*object.Integer).Value
return &object.String{Value: strings.Repeat(leftVal, int(rightVal))}
// 4 * " "
case 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 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:

View File

@@ -10,7 +10,7 @@ import (
"testing"
)
func TestEvalIntegerExpression(t *testing.T) {
func TestEvalExpressions(t *testing.T) {
tests := []struct {
input string
expected interface{}
@@ -36,6 +36,8 @@ func TestEvalIntegerExpression(t *testing.T) {
{"1 | 2", 3},
{"2 ^ 4", 6},
{"3 & 6", 2},
{`" " * 4`, " "},
{`4 * " "`, " "},
}
for _, tt := range tests {

View File

@@ -526,6 +526,18 @@ func (vm *VM) executeBinaryOperation(op code.Opcode) error {
rightType := right.Type()
switch {
// " " * 4
case left.Type() == object.STRING_OBJ && right.Type() == object.INTEGER_OBJ:
leftVal := left.(*object.String).Value
rightVal := right.(*object.Integer).Value
return vm.push(&object.String{Value: strings.Repeat(leftVal, int(rightVal))})
// 4 * " "
case left.Type() == object.INTEGER_OBJ && right.Type() == object.STRING_OBJ:
leftVal := left.(*object.Integer).Value
rightVal := right.(*object.String).Value
return vm.push(&object.String{Value: strings.Repeat(rightVal, int(leftVal))})
case leftType == object.BOOLEAN_OBJ && rightType == object.BOOLEAN_OBJ:
return vm.executeBinaryBooleanOperation(op, left, right)
case leftType == object.INTEGER_OBJ && rightType == object.INTEGER_OBJ:

View File

@@ -326,6 +326,8 @@ func TestStringExpressions(t *testing.T) {
{`"monkey"`, "monkey"},
{`"mon" + "key"`, "monkey"},
{`"mon" + "key" + "banana"`, "monkeybanana"},
{`" " * 4`, " "},
{`4 * " "`, " "},
}
runVmTests(t, tests)