Benutzerdefinierter Infix-Operator

10

Ich weiß, dass Operatoren in Julia nur Standardfunktionen sind, und ich kann sie mit der normalen Präfix-Aufrufsyntax verwenden:

julia> +(1, 2)
3

Sie sind jedoch auch insofern besonders, als sie als Infix-Operatoren verwendet werden können (und normalerweise werden):

julia> 1+2
3


Könnte ich meinen eigenen Infix-Operator definieren? Wenn das so ist, wie?

Zum Beispiel:

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
quelle

Antworten:

14

Wie Sie sagten, sind Operatoren nur Standardfunktionen, die Sie wie jede andere Funktion definieren und auf andere Weise bearbeiten können. Julias Parser ist jedoch so konfiguriert, dass bestimmte Symbole als Infix-Operatoren erkannt werden. Wenn Sie eine Funktion definieren, deren Name eines dieser Symbole ist, wird sie als Infix-Operator analysiert.

Zum Beispiel:

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


Die Liste der als Infix-Operatoren erkannten Symbole (und die zugehörige Priorität) finden Sie im Julia-Parser-Quellcode . Diese Liste ist größtenteils eine Teilmenge der Unicode-Kategorie Sm (Symbol, Mathematik).

Im Moment umfasst es zum Beispiel:

  • analysiert mit der gleichen Priorität wie +:
+ -        ±                 
                         
  • analysiert mit der gleichen Priorität wie *:
* / ÷ % &   ×                   
          ⦿             
                       
François Févotte
quelle
7
Sie können auch technisch fast jedes andere Symbol als Infix-Operator mit der Kraft von Makros verwenden! (wenn du wirklich willst). Ich hatte einen @infix Hack (der auf impliziter Multiplikation durch Gegenüberstellung beruht), der dies tat : julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlwurde als
Makroübung