Làm thế nào hữu ích là các toán tử infix trong một ngôn ngữ lập trình?


12

Làm thế nào hữu ích là các toán tử infix trong một ngôn ngữ lập trình? Họ có giá trị sự phức tạp thêm mà họ cung cấp? Bạn có thể cung cấp bất kỳ ví dụ nào trong đó các toán tử infix phù hợp hơn với vấn đề không thể xử lý bằng cách chỉ làm quá tải các toán tử bình thường không?


5
Bạn phải là một Lisper. Tôi có đúng không
missingfaktor

@missingfaktor: Đã sử dụng nó một cách đơn giản
Casebash

1
Làm thế nào là các toán tử infix liên quan đến quá tải toán tử?
Rein Henrichs

3
Điều đáng chú ý là phần lớn các ngôn ngữ OO (ish) phổ biến sử dụng infix cho tên phương thức. Thật vậy, một số ngôn ngữ đi đến một số độ dài để cho phép các phương thức "tĩnh" được viết như, nói, arg1.method(arg2)thay vì method(arg1, arg2).
Tom Hawtin - tackline

Câu trả lời:


15

Tôi nghĩ toán tử infix xuất phát từ toán học.

Điều này:

2 + 3 * 4

hầu hết mọi người đều dễ đọc hơn

(+ 2 (* 3 4))

bởi vì hầu hết mọi người đều quen thuộc với toán học

Đủ thú vị trong Haskell, bạn có thể nhảy giữa tiền tố và tiền tố. Điều này đang sử dụng cùng chức năng "(+)":

(+) 1 2
1 + 2

và điều này đang sử dụng cùng chức năng "elem":

elem 42 [1,2,42]
42 `elem` [1,2,42]

Quá tải các toán tử bình thường xử lý hầu hết các trường hợp này
Casebash

1
@Casebash: các toán tử "bình thường" đôi khi cũng là infix.
liori

2
Tôi phải chỉ lạ hơn, bởi vì tôi tìm thấy (+ 1 2) nhiều hơn nữa có thể đọc hơn 1 + 2. Ít nhất (+ 1 2 3 4 5)là tốt hơn 1 + 2 + 3 + 4 + 5.
Joe D

Ngoài ra còn có RPN: đẩy các phần tử, sau đó là toán tử.
PhiLho

@PhiLho Cũng được gọi là toán tử postfix! Như thế này: 1 2 +hoặc 1 2 3 4 5 +điển hình hơn cho trường hợp cuối cùng 1 2 + 3 + 4 + 5 +. Thực sự có một lợi thế cho những người ở chỗ nó mô hình hóa hoàn hảo một hệ thống dựa trên ngăn xếp và hiếm khi (nếu có?) Cần dấu ngoặc đơn để điều chỉnh mức độ ưu tiên của toán tử.
CodexArcanum

6

Ngôn ngữ máy tính được thiết kế cho con người chứ không phải máy móc. Và con người được sử dụng nhiều hơn cho các toán tử infix hơn tiền tố hoặc hậu tố.


5

Lý do thực sự duy nhất cho các nhà khai thác infix là con người thường thấy chúng dễ đọc hơn. Điều này phần lớn là do hai sự thật:

  • Chúng tôi học các toán tử infix dưới dạng toán học từ khi còn nhỏ và do đó quen thuộc với chúng: 2 * 2 = 4v.v.
  • Một toán tử infix có lợi thế là "trực quan" tách hai đối số. ví dụ(some complex expression) + (some other complex expression)

Từ góc độ logic / máy, các toán tử infix không thực sự thêm bất kỳ giá trị nào và trong một số trường hợp là một sự phiền toái:

  • Bạn luôn có thể chuyển đổi từ infix thành một lệnh gọi hàm tương đương với hai đối số - vì vậy các toán tử infix không bao giờ nhiều hơn "đường cú pháp"
  • Infix có thể bất tiện khi bạn muốn sử dụng nhiều hơn hai tham số. (* 1 2 3 4 5)trong Lisp chẳng hạn, có thể nói là một cú pháp gọn gàng hơn nhiều để nhân một bộ số.
  • Từ góc độ phân tích cú pháp, việc đọc toán tử trước tiên rất hữu ích để bạn biết cách diễn giải phần còn lại của biểu thức. Với các toán tử infix, điều này có thể phức tạp hơn nhiều (ví dụ: bạn phải duy trì một ngăn xếp hoặc một cái gì đó tương tự để tìm ra toán tử nào áp dụng cho các đối số nào)
  • Trong các ngôn ngữ dựa trên ngăn xếp / ghép nối như Forth, bạn muốn toán tử được đẩy lên ngăn xếp cuối cùng, để nó có các đối số của nó ở đúng vị trí. Một lần nữa, chôn người vận hành ở giữa một chuỗi các mã thông báo chỉ làm phức tạp vấn đề.
  • Các toán tử Infix có thể thực sự rất khó hiểu khi chúng bị quá tải - "+" nghĩa là gì khi áp dụng cho hai HashMaps chẳng hạn? Ở đây, sự hiểu biết trực quan của con người về toán tử infix hoạt động chống lại bạn bởi vì thật dễ dàng để giả định một ý nghĩa không thực sự có ý định .....

Tôi nghĩ rằng tranh luận cuối cùng là không có thật. Lập trình viên sử dụng tên hợp lý cho các hàm, cho dù sử dụng ký hiệu hay chữ cái.
Tom Hawtin - tackline

@Tom - chắc chắn, lập trình viên nên chọn tên hợp lý. Nhưng một trong những tiêu chí quan trọng cho "hợp lý" là "người khác có thể hiểu được bằng trực giác không?" - Tôi đã thấy rất nhiều trường hợp với quá tải nhà điều hành trong trường hợp này là xa trường hợp. Tôi không muốn phải đảo ngược định nghĩa của ai đó về định nghĩa ">> =" khi áp dụng cho một số loại dữ liệu tùy ý. Tên hàm đúng xin vui lòng!
mikera
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.