optimizations
This commit is contained in:
128
internal/ops/ops.go
Normal file
128
internal/ops/ops.go
Normal 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, "%")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user