Toán tử infix do người dùng định nghĩa


10

Tôi biết các toán tử trong Julia chỉ là các hàm tiêu chuẩn và tôi có thể sử dụng chúng bằng cú pháp gọi tiền tố thông thường:

julia> +(1, 2)
3

Tuy nhiên, chúng cũng đặc biệt theo nghĩa chúng có thể (và thường) được sử dụng làm toán tử infix:

julia> 1+2
3


Tôi có thể định nghĩa toán tử infix của riêng mình không? Nếu vậy thì thế nào?

Ví dụ:

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

Câu trả lời:


14

Như bạn đã nói, các toán tử chỉ là các hàm tiêu chuẩn, mà bạn có thể định nghĩa và thao tác giống như bất kỳ hàm nào khác. Tuy nhiên, trình phân tích cú pháp của Julia được cấu hình để nhận ra một tập hợp các ký hiệu nhất định là toán tử infix; nếu bạn xác định một hàm có tên là một trong những ký hiệu này, nó sẽ được phân tích cú pháp dưới dạng toán tử infix.

Ví dụ:

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


Danh sách các ký hiệu được công nhận là toán tử infix (và quyền ưu tiên liên quan) có thể được tìm thấy trong mã nguồn của trình phân tích cú pháp Julia . Đối với hầu hết các phần, danh sách này là một tập hợp con của thể loại unicode Sm (Biểu tượng, toán học).

Tại thời điểm này, nó bao gồm ví dụ:

  • được phân tích cú pháp có cùng mức độ ưu tiên như +:
+ -        ±                 
                         
  • được phân tích cú pháp có cùng mức độ ưu tiên như *:
* / ÷ % &   ×                   
          ⦿             
                       

7
Về mặt kỹ thuật, bạn cũng có thể sử dụng hầu hết mọi biểu tượng khác như một toán tử infix với sức mạnh của macro! (nếu bạn thực sự muốn). Tôi đã có một @infix hack (nó dựa vào phép nhân ngầm định bởi juxtap vị trí) đã làm điều này : julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2. ( InfixFunctions.jlđược phát triển như một bài tập vĩ mô cho bản thân tôi, nó không hoạt động với julia 1.x như vậy.)
SalchiPapa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.