func operateInts(op lex.Token, av, bv value.IntValue) value.Value { //if math.IsNaN(a) || math.IsNaN(b) { // return math.NaN() //} a, b := av.Val(), bv.Val() //u.Infof("a op b: %v %v %v", a, op.V, b) switch op.T { case lex.TokenPlus: // + //r = a + b return value.NewIntValue(a + b) case lex.TokenStar, lex.TokenMultiply: // * //r = a * b return value.NewIntValue(a * b) case lex.TokenMinus: // - //r = a - b return value.NewIntValue(a - b) case lex.TokenDivide: // / //r = a / b //u.Debugf("divide: %v / %v = %v", a, b, a/b) return value.NewIntValue(a / b) case lex.TokenModulus: // % //r = a / b //u.Debugf("modulus: %v / %v = %v", a, b, a/b) return value.NewIntValue(a % b) // Below here are Boolean Returns case lex.TokenEqualEqual: // == if a == b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenGT: // > if a > b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenNE: // != or <> if a != b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenLT: // < if a < b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenGE: // >= if a >= b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenLE: // <= if a <= b { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenLogicOr, lex.TokenOr: // || if a != 0 || b != 0 { return value.BoolValueTrue } else { return value.BoolValueFalse } case lex.TokenLogicAnd: // && if a != 0 && b != 0 { return value.BoolValueTrue } else { return value.BoolValueFalse } } panic(fmt.Errorf("expr: unknown operator %s", op)) }
func operateInts(op lex.Token, av, bv value.IntValue) value.Value { a, b := av.Val(), bv.Val() v, _ := operateIntVals(op, a, b) return v }