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