129 lines
2.4 KiB
Go
129 lines
2.4 KiB
Go
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, "%")
|
|
}
|
|
}
|