2010-11-03 37 views
14

Một question được đăng về các toán tử so sánh xích và cách chúng được diễn giải bằng các ngôn ngữ khác nhau.Hỗ trợ ngôn ngữ cho các toán tử so sánh xích (x <y <z)

Các toán tử so sánh chuỗi có nghĩa là (x < y < z) sẽ được hiểu là ((x < y) && (y < z)) thay vì là ((x < y) < z).

Nhận xét về câu hỏi đó cho thấy Python, Perl 6 và Mathematica hỗ trợ chuỗi so sánh toán tử, nhưng những ngôn ngữ nào khác hỗ trợ tính năng này và tại sao nó không phổ biến hơn?

Xem nhanh tài liệu Python cho thấy tính năng này đã có từ ít nhất năm 1996. Có lý do nào khiến nhiều ngôn ngữ chưa thêm cú pháp này?

Ngôn ngữ được nhập tĩnh sẽ có vấn đề với chuyển đổi loại, nhưng có những lý do nào khác không phổ biến hơn không?

+1

Câu hỏi hay. Dường như với tôi rằng nó thậm chí sẽ tương thích ngược với Java ít nhất. (Vì '<' and '>' không được định nghĩa cho booleans.) – aioobe

+1

Tôi nghĩ nó không phổ biến bởi vì các lập trình viên quá quen với '<' là toán tử nhị phân. – CodesInChaos

+0

Tại sao ngôn ngữ gõ tĩnh có vấn đề với điều này? Ý bạn là loại chuyển đổi nào? Ví dụ: – sepp2k

Trả lời

9

Nó nên phổ biến hơn, nhưng tôi nghi ngờ nó không phải là vì nó làm cho việc phân tích ngôn ngữ phức tạp hơn.

Lợi ích:

  • duy trì những nguyên tắc tối thiểu ngạc nhiên
  • Reads như toán học được dạy
  • Giảm tải nhận thức (xem trước 2 điểm)

Nhược điểm:

  • Ngữ pháp phức tạp hơn cho ngôn ngữ
  • Trường hợp đặc biệt cú pháp đường

Là tại sao không, dự đoán của tôi là:

  • Ngôn ngữ tác giả (s) đã không nghĩ về nó
  • là trên 'tốt đẹp để có 'danh sách
  • Đã được quyết định rằng nó không đủ hữu ích để biện minh cho việc triển khai
11

Lợi ích quá nhỏ để biện minh cho việc làm phức tạp ngôn ngữ.

Bạn không cần nó thường xuyên, và thật dễ dàng để có được cùng một hiệu ứng rõ ràng với một vài ký tự hơn.

+1

Tính phức tạp được thêm vào có vẻ như là một lý do không tốt. Tôi không thể nghĩ ra lý do rằng chức năng hiện tại sẽ hữu ích trong ngôn ngữ được nhập động, trong khi điều này sẽ bổ sung thêm chức năng mà không có nhiều xung đột. Nó cũng dường như với tôi rằng nó dễ đọc hơn. –

+0

Tôi có xu hướng đồng ý. Nó gọn gàng một trong một triệu lần, nhưng chắc chắn phải mất rất nhiều rắc rối để thực hiện và kết hợp vào ngữ pháp. – delnan

+0

@Alan Bạn không được nghĩ về nó theo cách đó. Thay vào đó bạn phải xoay nó lại, bạn sẽ đạt được gì, so với công việc cần thiết cho spec, document, plan, implement và test nó? –

1

Tôi nghĩ ICON là ngôn ngữ gốc để có điều này, và trong ICON nó rơi ra khỏi cách mà booleans được xử lý như thẻ 'thất bại' đặc biệt với tất cả các giá trị khác được coi là đúng.

3

Scheme (và có lẽ hầu hết ngôn ngữ gia đình Lisp khác) hỗ trợ nhiều so một cách hiệu quả trong ngữ pháp của nó:

(< x y z) 

này có thể được coi là một ứng dụng chức năng bình thường của < chức năng với ba đối số. Xem 6.2.5 Numerical Operations trong đặc điểm kỹ thuật.

Clojure cũng hỗ trợ chained comparison.

+0

Tính năng này có hoạt động với n đối số không? – starblue

+0

@ starblue: Có, càng nhiều đối số tùy thích. –

1

Chained co mparison là một tính năng của BCPL, kể từ cuối những năm 1960.

Các vấn đề liên quan