Определений користувачем оператор фіксації


10

Я знаю, що оператори в Julia - це лише стандартні функції, і я можу їх використовувати, використовуючи звичайний синтаксис виклику префікса:

julia> +(1, 2)
3

Однак вони також особливі в тому сенсі, що їх можна (і зазвичай) використовувати як оператори інфікування:

julia> 1+2
3


Чи можу я визначити власного оператора infix? Якщо так, то як?

Наприклад:

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

Відповіді:


14

Як ви вже говорили, оператори - це лише стандартні функції, якими ви можете визначати та іншим чином маніпулювати, як будь-яка інша функція. Однак аналізатор Юлії налаштований на розпізнавання певного набору символів як операторів інфікування; якщо ви визначите функцію, ім'я якої є одним із цих символів, вона буде проаналізована як оператор інфіксації.

Наприклад:

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


Список символів, визнаних операторами інфікування (та пов'язаним з ними пріоритетом), можна знайти у вихідному коді аналізатора Julia . Здебільшого цей список є підмножиною категорії унікоду Sm (Symbol, math).

На даний момент він включає, наприклад:

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

7
Ви також можете технічно використовувати майже будь-який інший символ як оператор інфікування з потужністю макросів! (якщо ви дуже хочете). У мене був @infix хак (він спирається на неявне множення на протиставленні) , що зробив це: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlбула розроблена як макро-вправа для себе, вона не працює з Джулією 1.x, як є.)
— SalchiPapa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.