optimizations
Some checks failed
Build / build (push) Successful in 10m47s
Publish Image / publish (push) Failing after 33s
Test / build (push) Failing after 6m42s

This commit is contained in:
Chuck Smith
2024-04-02 14:54:08 -04:00
parent 88e3330856
commit f08b458325
9 changed files with 313 additions and 355 deletions

128
internal/ops/ops.go Normal file
View File

@@ -0,0 +1,128 @@
package ops
import "monkey/internal/object"
func Add(left, right object.Object) (object.Object, error) {
switch obj := left.(type) {
case object.Integer:
val, err := obj.Add(right)
if err != nil {
return nil, err
}
return val, nil
case object.Float:
val, err := obj.Add(right)
if err != nil {
return nil, err
}
return val, err
case object.String:
val, err := obj.Add(right)
if err != nil {
return nil, err
}
return val, nil
case *object.Array:
val, err := obj.Add(right)
if err != nil {
return nil, err
}
return val, nil
case *object.Hash:
val, err := obj.Add(right)
if err != nil {
return nil, err
}
return val, nil
default:
return nil, object.NewBinaryOpError(left, right, "+")
}
}
func Sub(left, right object.Object) (object.Object, error) {
switch obj := left.(type) {
case object.Integer:
val, err := obj.Sub(right)
if err != nil {
return nil, err
}
return val, nil
case object.Float:
val, err := obj.Sub(right)
if err != nil {
return nil, err
}
return val, nil
default:
return nil, object.NewBinaryOpError(left, right, "-")
}
}
func Mul(left, right object.Object) (object.Object, error) {
switch obj := left.(type) {
case *object.Array:
val, err := obj.Mul(right)
if err != nil {
return nil, err
}
return val, nil
case object.Integer:
val, err := obj.Mul(right)
if err != nil {
return nil, err
}
return val, nil
case object.Float:
val, err := obj.Mul(right)
if err != nil {
return nil, err
}
return val, nil
case object.String:
val, err := obj.Mul(right)
if err != nil {
return nil, err
}
return val, nil
default:
return nil, object.NewBinaryOpError(left, right, "*")
}
}
func Div(left, right object.Object) (object.Object, error) {
switch obj := left.(type) {
case object.Integer:
val, err := obj.Div(right)
if err != nil {
return nil, err
}
return val, nil
case object.Float:
val, err := obj.Div(right)
if err != nil {
return nil, err
}
return val, nil
default:
return nil, object.NewBinaryOpError(left, right, "/")
}
}
func Mod(left, right object.Object) (object.Object, error) {
switch obj := left.(type) {
case object.Integer:
val, err := obj.Mod(right)
if err != nil {
return nil, err
}
return val, nil
case object.Float:
val, err := obj.Mod(right)
if err != nil {
return nil, err
}
return val, nil
default:
return nil, object.NewBinaryOpError(left, right, "%")
}
}