aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-08-10 20:50:15 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-08-10 20:50:15 -0400
commit6d3d104363426d9d26a3fa65979899c032a093a7 (patch)
tree1d0353fc224d0d97c5f987c5087e8ac018c98d81 /docs
parentf0e56acc5b7930111ddf429f7186f0e72146517e (diff)
Overhaul of operator metamethods
Diffstat (limited to 'docs')
-rw-r--r--docs/operators.md127
1 files changed, 127 insertions, 0 deletions
diff --git a/docs/operators.md b/docs/operators.md
new file mode 100644
index 00000000..6716b944
--- /dev/null
+++ b/docs/operators.md
@@ -0,0 +1,127 @@
+# Operator Overloading
+
+Operator overloading is supported, but _strongly discouraged_. Operator
+overloading should only be used for types that represent mathematical concepts
+that users can be reliably expected to understand how they behave with math
+operators, and for which the implementations are extremely efficient. Operator
+overloading should not be used to hide expensive computations or to create
+domain-specific syntax to make certain operations more concise. Examples of
+good candidates for operator overloading would include:
+
+- Mathematical vectors
+- Matrices
+- Quaternions
+- Complex numbers
+
+Bad candidates would include:
+
+- Arbitrarily sized datastructures
+- Objects that represent regular expressions
+- Objects that represent filesystem paths
+
+## Available Operator Overloads
+
+When performing a math operation between any two types that are not both
+numerical or boolean, the compiler will look up the appropriate method and
+insert a function call to that method. Math overload operations are all assumed
+to return a value that is the same type as the first argument and the second
+argument must be either the same type as the first argument or a number,
+depending on the specifications of the specific operator.
+
+### Addition
+
+```
+func plus(T, T)->T
+```
+
+The `+` operator invokes the `plus()` method, which takes two objects of the
+same type and returns a new value of the same type.
+
+### Subtraction
+
+```
+func minus(T, T)->T
+```
+
+The `-` operator invokes the `minus()` method, which takes two objects of the
+same type and returns a new value of the same type.
+
+### Multiplication
+
+```
+func times(T, T)->T
+```
+
+The `*` operator invokes the `times()` method, which takes two objects of the
+same type and returns a new value of the same type. This should _not_ be used
+to implement either a dot product or a cross product. Dot products and cross
+products should be implemented as explicitly named methods.
+
+```
+func scaled_by(T, N)->T
+```
+
+In a multiplication expression, `a*b`, if either `a` or `b` has type `T` and
+the other has a numeric type `N` (either `Int8`, `Int16`, `Int32`, `Int`,
+`Num32`, or `Num`), then the method `scaled_by()` will be invoked.
+
+### Division
+
+```
+func divided_by(T, N)->T
+```
+
+In a division expression, `a/b`, if `a` has type `T` and `b` has a numeric
+type `N`, then the method `divided_by()` will be invoked.
+
+### Exponentiation
+
+```
+func power(T, N)->T
+```
+
+In an exponentiation expression, `a^b`, if `a` has type `T` and `b` has a
+numeric type `N`, then the method `power()` will be invoked.
+
+### Modulus
+
+```
+func mod(T, N)->T
+func mod1(T, N)->T
+```
+
+In a modulus expression, `a mod b` or `a mod1 b`, if `a` has type `T` and `b`
+has a numeric type `N`, then the method `mod()` or `mod1()` will be invoked.
+
+### Negative
+
+```
+func negative(T)->T
+```
+
+In a unary negative expression `-x`, the method `negative()` will be invoked.
+
+### Bit Operations
+
+```
+func left_shift(T, Int)->T
+func right_shift(T, Int)->T
+func bit_and(T, T)->T
+func bit_or(T, T)->T
+func bit_xor(T, T)->T
+```
+
+In a bit shifting expression, `a >> b` or `a << b`, if `a` has type `T` and `b`
+is an `Int`, then the method `left_shift()` or `right_shift()` will be invoked.
+
+In a bitwise binary operation `a and b`, `a or b`, or `a xor b`, then the
+method `bit_and()`, `bit_or()`, or `bit_xor()` will be invoked.
+
+### Bitwise Negation
+
+```
+func negated(T)->T
+```
+
+In a unary bitwise negation expression `not x`, the method `negated()` will be
+invoked.