Operador de infixo definido pelo usuário

10

Eu sei que os operadores em Julia são apenas funções padrão e posso usá-los usando a sintaxe de chamada de prefixo comum:

julia> +(1, 2)
3

No entanto, eles também são especiais no sentido de que podem ser (e geralmente são) usados ​​como operadores de infix:

julia> 1+2
3


Eu poderia definir meu próprio operador de infixo? Se sim, como?

Por exemplo:

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
François Févotte
fonte

Respostas:

14

Como você disse, os operadores são apenas funções padrão, que você pode definir e manipular como qualquer outra função. No entanto, o analisador de Julia está configurado para reconhecer um certo conjunto de símbolos como operadores de infix; se você definir uma função cujo nome é um desses símbolos, ela será analisada como um operador de infixo.

Por exemplo:

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


A lista de símbolos reconhecidos como operadores de infixo (e precedência associada) pode ser encontrada no código-fonte do analisador Julia . Na maioria das vezes, esta lista é um subconjunto da categoria unicode Sm (símbolo, matemática).

No momento, inclui, por exemplo:

  • analisado com a mesma precedência que +:
+ -        ±                 
                         
  • analisado com a mesma precedência que *:
* / ÷ % &   ×                   
          ⦿             
                       
François Févotte
fonte
7
Tecnicamente, você também pode usar quase qualquer outro símbolo como operador de infixo com o poder das macros! (se você realmente quiser). Eu tinha um @infix corte (ele depende de multiplicação implícita por justaposição) que fez isso: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlfoi desenvolvido como um exercício macro para mim, ele não funciona com julia 1.x como está.)
SalchiPapa