Operator infix yang ditentukan pengguna


10

Saya tahu operator di Julia hanyalah fungsi standar, dan saya bisa menggunakannya menggunakan sintaks panggilan awalan biasa:

julia> +(1, 2)
3

Namun, mereka juga istimewa dalam arti bahwa mereka dapat (dan biasanya) digunakan sebagai operator infiks:

julia> 1+2
3


Bisakah saya mendefinisikan operator infiks saya sendiri? Jika ya, bagaimana caranya?

Sebagai contoh:

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

Jawaban:


14

Seperti yang Anda katakan, operator hanyalah fungsi standar, yang dapat Anda tetapkan dan memanipulasi seperti fungsi lainnya. Namun, parser Julia dikonfigurasikan untuk mengenali serangkaian simbol tertentu sebagai operator infiks; jika Anda mendefinisikan fungsi yang namanya adalah salah satu dari simbol-simbol ini, itu akan diuraikan sebagai operator infiks.

Sebagai contoh:

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


Daftar simbol yang dikenali sebagai operator infiks (dan prioritas terkait) dapat ditemukan dalam kode sumber parser Julia . Sebagian besar, daftar ini adalah subset dari kategori unicode Sm (Simbol, matematika).

Saat ini, itu termasuk misalnya:

  • diuraikan dengan prioritas yang sama seperti +:
+ -        ±                 
                         
  • diuraikan dengan prioritas yang sama seperti *:
* / ÷ % &   ×                   
          ⦿             
                       

7
Anda juga dapat secara teknis menggunakan hampir semua simbol lain sebagai operator infiks dengan kekuatan makro! (jika Anda benar-benar ingin). Aku punya @infix hack (hal itu bergantung pada perkalian implisit oleh penjajaran) yang melakukan ini: julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jldikembangkan sebagai latihan makro untuk diri saya sendiri, itu tidak bekerja dengan julia 1.x sebagaimana adanya.)
SalchiPapa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.