Operador infijo definido por el usuario


10

Sé que los operadores en Julia son solo funciones estándar, y puedo usarlas usando la sintaxis de llamada de prefijo ordinario:

julia> +(1, 2)
3

Sin embargo, también son especiales en el sentido de que se pueden usar (y generalmente se usan) como operadores infijos:

julia> 1+2
3


¿Podría definir mi propio operador infijo? ¿Si es así, cómo?

Por ejemplo:

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

Respuestas:


14

Como dijiste, los operadores son solo funciones estándar, que puedes definir y manipular como cualquier otra función. Sin embargo, el analizador de Julia está configurado para reconocer un cierto conjunto de símbolos como operadores de infijo; si define una función cuyo nombre es uno de estos símbolos, se analizará como un operador infijo.

Por ejemplo:

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


La lista de símbolos reconocidos como operadores de infijo (y precedencia asociada) se puede encontrar en el código fuente del analizador Julia . En su mayor parte, esta lista es un subconjunto de la categoría Unicode Sm (Símbolo, matemática).

Por el momento, incluye por ejemplo:

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

77
¡También podría utilizar técnicamente casi cualquier otro símbolo como operador infijo con el poder de las macros! (Si de verdad quieres). Tenía un @infix corte (que se basa en la multiplicación implícita por yuxtaposición) que hizo esto: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlfue desarrollado como un ejercicio macro para mí, no funciona con julia 1.x como está.)
— SalchiPapa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.