OxL Справочник OxL
РусскийEnglish

5.3 Перегрузка и пользовательские операторы

Перегрузка встроенных операторов — объявления op в impl:

oxl
impl Vec3 {
  static op +(a: Vec3, b: Vec3) -> Vec3 => Vec3(a.x + b.x, a.y + b.y, a.z + b.z)
  static op *(v: Vec3, k: f32) -> Vec3 => Vec3(v.x * k, v.y * k, v.z * k)
  static op -(v: Vec3) -> Vec3 => v * -1.0
  op [](i: usize) -> f32 { … }            // чтение по индексу
  var op [](i: usize) -> &var f32 { … }   // запись по индексу
  op ()(t: f32) -> Vec3 { … }             // вызов как функции
  static op <=>(a: Vec3, b: Vec3) -> Ordering { … }
  op as Vec4 => Vec4(x, y, z, 1.0)
}
  • Перегружаемые: арифметические, побитовые, сравнения через <=>, [], (), as, составные присваивания.
  • НЕ перегружаемые: && || ?? ?. ? ! is = -> ?-> ~> !> |> =>, ., ...
  • a op= b по умолчанию означает a = a op b; объявление var op += заменяет это поведение.
  • ==/!= берутся из Eq; <, <=, >, >= — из <=> (Ord).
  • Неявных преобразований нет; op as T вызывается только явным x as T.

Пользовательские операторы:

oxl
operator <|> <T>(a: Parser<T>, b: Parser<T>) -> Parser<T>  infixl 3 => a.orElse(b)
operator ~~ (s: str, re: Regex) -> bool                      infix 4 => re.matches(s)
operator ^^ (a: f64, b: f64) -> f64                          infixr 12 => a.pow(b)
operator ¬ (b: Bits) -> Bits                                prefix => b.invert()
  • Символ оператора — последовательность из + - * / % < > = ! & | ^ ~ ? . или символов Unicode категорий Sm/So. Последовательность НЕ ДОЛЖНА совпадать со встроенным оператором или разделителем и НЕ ДОЛЖНА начинаться с // или /*.
  • Фиксность: infixl N, infixr N, infix N (N — уровень 1–12 из таблицы 5.2) или prefix (уровень 14). Постфиксных пользовательских операторов нет.
  • Оператор — обычное объявление с видимостью; в другом модуле используется только после явного импорта (use parsers { <|> }).
  • Любую функцию двух аргументов можно вызвать инфиксно: a `max` b (уровень 4, без ассоциативности).

not-callable, not-overloadable, operator-decl, range-not-iterable

См. также

Исходник: docs/spec/oxl-standard.md