Zdefiniowany przez użytkownika operator infix

10

Wiem, że operatory w Julii są tylko standardowymi funkcjami i mogę ich używać przy użyciu zwykłej składni wywołania prefiksu:

julia> +(1, 2)
3

Są one jednak wyjątkowe w tym sensie, że mogą być (i zwykle są) używane jako operatory infix:

julia> 1+2
3


Czy mogę zdefiniować własnego operatora infix? Jeśli tak to jak?

Na przykład:

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
źródło

Odpowiedzi:

14

Jak już powiedziano, operatory są tylko standardowymi funkcjami, które można definiować i w inny sposób nimi manipulować jak każdą inną funkcję. Parser Julii jest jednak skonfigurowany do rozpoznawania określonego zestawu symboli jako operatorów infix; jeśli zdefiniujesz funkcję, której nazwa jest jednym z tych symboli, zostanie ona przeanalizowana jako operator infix.

Na przykład:

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


Lista symboli rozpoznawanych jako operatory infix (i związany z nimi priorytet) znajduje się w kodzie źródłowym analizatora składni Julii . W przeważającej części ta lista jest podzbiorem kategorii Unicode Sm (Symbol, matematyka).

Obecnie obejmuje na przykład:

  • przeanalizowane z takim samym pierwszeństwem jak +:
+ -        ±                 
                         
  • przeanalizowane z takim samym pierwszeństwem jak *:
* / ÷ % &   ×                   
          ⦿             
                       
François Févotte
źródło
7
Można również technicznie użyć prawie dowolnego innego symbolu jako operatora infix z mocą makr! (jeśli naprawdę chcesz). Miałem @infix siekać (opiera się na niejawny mnożenia przez zestawienie), który to zrobił: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlzostał opracowany jako ćwiczenie makro dla mnie, nie działa z Julią 1.x jak jest.)
SalchiPapa