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

10

Я знаю, что операторы в 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
Франсуа Февотт
источник

Ответы:

14

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

Например:

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

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

# infix operator call
julia> 12
3

julia> 1  2
3


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

На данный момент это включает в себя, например:

  • анализируется с тем же приоритетом, что и +:
+ -        ±                 
                         
  • анализируется с тем же приоритетом, что и *:
* / ÷ % &   ×                   
          ⦿             
                       
Франсуа Февотт
источник
7
Вы также можете технически использовать практически любой другой символ в качестве инфиксного оператора с мощью макросов! (если вы действительно хотите). У меня был @infix хак (он опирается на неявное умножение на противопоставлении) , что сделал это: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlдля меня было разработано макрокоманда, она не работает с julia 1.x как есть.)
SalchiPapa