Operatore infix definito dall'utente


10

So che gli operatori in Julia sono solo funzioni standard e posso usarli usando la normale sintassi della chiamata con prefisso:

julia> +(1, 2)
3

Tuttavia, sono anche speciali, nel senso che possono essere (e di solito) utilizzati come operatori infix:

julia> 1+2
3


Posso definire il mio operatore infix? Se é cosi, come?

Per esempio:

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

Risposte:


14

Come hai detto, gli operatori sono solo funzioni standard, che puoi definire e altrimenti manipolare come qualsiasi altra funzione. Tuttavia, il parser di Julia è configurato per riconoscere un certo set di simboli come operatori infix; se si definisce una funzione il cui nome è uno di questi simboli, verrà analizzata come operatore infix.

Per esempio:

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


L'elenco dei simboli riconosciuti come operatori infix (e la precedenza associata) è disponibile nel codice sorgente del parser Julia . Per la maggior parte, questo elenco è un sottoinsieme della categoria unicode Sm (simbolo, matematica).

Al momento, include ad esempio:

  • analizzato con la stessa precedenza di +:
+ -        ±                 
                         
  • analizzato con la stessa precedenza di *:
* / ÷ % &   ×                   
          ⦿             
                       

7
Potresti anche tecnicamente usare quasi qualsiasi altro simbolo come operatore infix con la potenza delle macro! (se vuoi davvero). Ho avuto un @infix mod (si basa sulla moltiplicazione implicita per giustapposizione) che ha fatto questo: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. (È InfixFunctions.jlstato sviluppato come un esercizio macro per me stesso, non funziona con julia 1.x come è.)
SalchiPapa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.