Пользовательский инфиксный оператор

Я знаю, что операторы в Julia - это просто стандартные функции, и я могу использовать их, используя обычный синтаксис префиксного вызова:

julia> +(1, 2)
3

Однако они также являются особенными в том смысле, что их можно (и обычно) использовать как инфиксные операторы:

julia> 1+2
3


Могу ли я определить собственный инфиксный оператор? Если да, то как?

Например:

julia> α(x, y) = x+y
α (generic function with 1 method)

julia> α(1, 2)
3 # as expected

julia> 1α2
# expected result: 3
ERROR: UndefVarError: α2 not defined
Stacktrace:
 [1] top-level scope at REPL[5]:1

julia> 1 α 2
# expected result: 3
ERROR: syntax: extra token "α" after end of expression
Stacktrace:
 [1] top-level scope at REPL[5]:0

1 ответ

Как вы сказали, операторы - это просто стандартные функции, которые вы можете определять и манипулировать ими, как любой другой функцией. Однако синтаксический анализатор Джулии настроен на распознавание определенного набора символов как инфиксных операторов; если вы определите функцию, имя которой является одним из этих символов, она будет проанализирована как инфиксный оператор.

Например:

julia> ⊕(x, y) = x+y
⊕ (generic function with 1 method)

# standard prefix function call
julia> ⊕(1, 2)
3

# infix operator call
julia> 1⊕2
3

julia> 1 ⊕ 2
3


Список символов, распознаваемых как инфиксные операторы (и связанный с ними приоритет), можно найти в исходном коде парсера Julia. По большей части этот список представляет собой подмножество категории юникода Sm(символ, математика).

На данный момент в него входят, например:

  • разбирается с тем же приоритетом, что и +:
+ - ⊕ ⊖ ⊞ ⊟ ∪ ∨ ⊔ ± ∓ ∔ ∸ ≏ ⊎ ⊻ ⊽ ⋎ ⋓ ⧺ ⧻ ⨈ ⨢ ⨣ ⨤ ⨥ ⨦
⨧ ⨨ ⨩ ⨪ ⨫ ⨬ ⨭ ⨮ ⨹ ⨺ ⩁ ⩂ ⩅ ⩊ ⩌ ⩏ ⩐ ⩒ ⩔ ⩖ ⩗ ⩛ ⩝ ⩡ ⩢ ⩣
  • разбирается с тем же приоритетом, что и *:
* / ÷ % & ⋅ ∘ × ∩ ∧ ⊗ ⊘ ⊙ ⊚ ⊛ ⊠ ⊡ ⊓ ∗ ∙ ∤ ⅋ ≀ ⊼ ⋄ ⋆ ⋇
⋉ ⋊ ⋋ ⋌ ⋏ ⋒ ⟑ ⦸ ⦼ ⦾ ⦿ ⧶ ⧷ ⨇ ⨰ ⨱ ⨲ ⨳ ⨴ ⨵ ⨶ ⨷ ⨸ ⨻
⨼ ⨽ ⩀ ⩃ ⩄ ⩋ ⩍ ⩎ ⩑ ⩓ ⩕ ⩘ ⩚ ⩜ ⩞ ⩟ ⩠ ⫛ ⊍ ▷ ⨝ ⟕ ⟖ ⟗
Другие вопросы по тегам