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> 1⊕2
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.