diff --git a/operator-prod.go b/operator-prod.go index 5ef0cbc..950795a 100644 --- a/operator-prod.go +++ b/operator-prod.go @@ -34,16 +34,16 @@ func evalMultiply(ctx ExprContext, self *term) (v any, err error) { s, _ := leftValue.(string) n, _ := rightValue.(int64) v = strings.Repeat(s, int(n)) - } else if isNumber(leftValue) && isNumber(rightValue) { + } else if isNumOrFract(leftValue) && isNumOrFract(rightValue) { if isFloat(leftValue) || isFloat(rightValue) { v = numAsFloat(leftValue) * numAsFloat(rightValue) + } else if isFraction(leftValue) || isFraction(rightValue) { + v, err = mulAnyFract(leftValue, rightValue) } else { leftInt, _ := leftValue.(int64) rightInt, _ := rightValue.(int64) v = leftInt * rightInt } - } else if isFraction(leftValue) || isFraction(rightValue) { - v, err = mulAnyFract(leftValue, rightValue) } else { err = self.errIncompatibleTypes(leftValue, rightValue) } @@ -71,7 +71,7 @@ func evalDivide(ctx ExprContext, self *term) (v any, err error) { return } - if isNumber(leftValue) && isNumber(rightValue) { + if isNumOrFract(leftValue) && isNumOrFract(rightValue) { if isFloat(leftValue) || isFloat(rightValue) { d := numAsFloat(rightValue) if d == 0.0 { @@ -79,6 +79,8 @@ func evalDivide(ctx ExprContext, self *term) (v any, err error) { } else { v = numAsFloat(leftValue) / d } + } else if isFraction(leftValue) || isFraction(rightValue) { + v, err = divAnyFract(leftValue, rightValue) } else { leftInt, _ := leftValue.(int64) if rightInt, _ := rightValue.(int64); rightInt == 0 { @@ -87,8 +89,6 @@ func evalDivide(ctx ExprContext, self *term) (v any, err error) { v = leftInt / rightInt } } - } else if isFraction(leftValue) || isFraction(rightValue) { - v, err = divAnyFract(leftValue, rightValue) } else { err = self.errIncompatibleTypes(leftValue, rightValue) } @@ -114,7 +114,7 @@ func evalDivideAsFloat(ctx ExprContext, self *term) (v any, err error) { return } - if isNumber(leftValue) && isNumber(rightValue) { + if isNumOrFract(leftValue) && isNumOrFract(rightValue) { d := numAsFloat(rightValue) if d == 0.0 { err = errors.New("division by zero") diff --git a/operator-sum.go b/operator-sum.go index 352e5de..843a413 100644 --- a/operator-sum.go +++ b/operator-sum.go @@ -86,9 +86,11 @@ func evalMinus(ctx ExprContext, self *term) (v any, err error) { return } - if isNumber(leftValue) && isNumber(rightValue) { + if isNumOrFract(leftValue) && isNumOrFract(rightValue) { if isFloat(leftValue) || isFloat(rightValue) { v = numAsFloat(leftValue) - numAsFloat(rightValue) + } else if isFraction(leftValue) || isFraction(rightValue) { + v, err = subAnyFract(leftValue, rightValue) } else { leftInt, _ := leftValue.(int64) rightInt, _ := rightValue.(int64) @@ -104,8 +106,6 @@ func evalMinus(ctx ExprContext, self *term) (v any, err error) { } } v = &diffList - } else if isFraction(leftValue) || isFraction(rightValue) { - v, err = subAnyFract(leftValue, rightValue) } else { err = self.errIncompatibleTypes(leftValue, rightValue) }