Boo has operator overloading. Overloaded operators must be defined as static. For example:

struct myNum:
    i as double
    def constructor(j as int):
        i = j
    static def op_Multiply(x as myNum, j as int):
        x.i = x.i * j
        return x
    static def op_Multiply(x as myNum, y as myNum):
        x.i = x.i * y.i
        return x
    static def op_Addition(x as myNum, j as int):
        x.i = x.i + j
        return x
    static def op_Equality(x as myNum, y as double):
        return x.i == y
    static def op_UnaryNegation(x as myNum):
        x.i = -x.i
        return x
    def ToString():
        return i.ToString()

x = myNum(5)
y = -x*x*2 + 1
assert y == -49

These binary operators can be overloaded:

op_Addition
op_Subtraction
op_Multiply
op_Division
op_Modulus
op_Exponentiation
op_Equality
op_LessThan
op_LessThanOrEqual
op_GreaterThan
op_GreaterThanOrEqual
op_Match
op_NotMatch
op_Member
op_NotMember
op_BitwiseOr
op_BitwiseAnd

When you overload a binary arithmetic operator such as op_Addition, the corresponding assignment operator ( += ) is overloaded too.

This unary operator can be overloaded:

op_UnaryNegation