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

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> 1⊕2
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 *:
* / ÷ % & ⋅ ∘ × ∩ ∧ ⊗ ⊘ ⊙ ⊚ ⊛ ⊠ ⊡ ⊓ ∗ ∙ ∤ ⅋ ≀ ⊼ ⋄ ⋆ ⋇
⋉ ⋊ ⋋ ⋌ ⋏ ⋒ ⟑ ⦸ ⦼ ⦾ ⦿ ⧶ ⧷ ⨇ ⨰ ⨱ ⨲ ⨳ ⨴ ⨵ ⨶ ⨷ ⨸ ⨻
⨼ ⨽ ⩀ ⩃ ⩄ ⩋ ⩍ ⩎ ⩑ ⩓ ⩕ ⩘ ⩚ ⩜ ⩞ ⩟ ⩠ ⫛ ⊍ ▷ ⨝ ⟕ ⟖ ⟗

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.