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


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> 12
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.