Tại sao x < y < z
không phổ biến trong các ngôn ngữ lập trình?
Trong câu trả lời này, tôi kết luận rằng
- mặc dù cấu trúc này không quan trọng để thực hiện theo ngữ pháp của ngôn ngữ và tạo ra giá trị cho người dùng ngôn ngữ,
- những lý do chính khiến điều này không tồn tại trong hầu hết các ngôn ngữ là do tầm quan trọng của nó so với các tính năng khác và sự không sẵn lòng của các cơ quan quản lý ngôn ngữ đối với một trong hai ngôn ngữ
- làm người dùng khó chịu với những thay đổi có khả năng phá vỡ
- để di chuyển để thực hiện tính năng (tức là: sự lười biếng).
Giới thiệu
Tôi có thể nói từ quan điểm của Pythonist về câu hỏi này. Tôi là người sử dụng ngôn ngữ có tính năng này và tôi thích nghiên cứu chi tiết triển khai ngôn ngữ. Ngoài ra, tôi có phần quen thuộc với quá trình thay đổi ngôn ngữ như C và C ++ (tiêu chuẩn ISO được điều chỉnh bởi ủy ban và được phiên bản theo năm.) Và tôi đã xem cả Ruby và Python thực hiện các thay đổi vi phạm.
Tài liệu và cách thực hiện của Python
Từ các tài liệu / ngữ pháp, chúng ta thấy rằng chúng ta có thể xâu chuỗi bất kỳ số lượng biểu thức nào với các toán tử so sánh:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
và các tài liệu nêu thêm:
Việc so sánh có thể được xâu chuỗi tùy ý, ví dụ: x <y <= z tương đương với x <y và y <= z, ngoại trừ việc y chỉ được đánh giá một lần (nhưng trong cả hai trường hợp z đều không được đánh giá khi tìm thấy x <y là sai).
Tương đương logic
Vì thế
result = (x < y <= z)
là một cách logic tương đương về mặt đánh giá x
, y
và z
, với ngoại lệ mà y
được đánh giá hai lần:
x_lessthan_y = (x < y)
if x_lessthan_y: # z is evaluated contingent on x < y being True
y_lessthan_z = (y <= z)
result = y_lessthan_z
else:
result = x_lessthan_y
Một lần nữa, sự khác biệt là y chỉ được đánh giá một lần với (x < y <= z)
.
(Lưu ý, các dấu ngoặc đơn là hoàn toàn không cần thiết và dư thừa, nhưng tôi đã sử dụng chúng vì lợi ích của những từ đến từ các ngôn ngữ khác và mã trên là Python khá hợp pháp.)
Kiểm tra cây cú pháp trừu tượng
Chúng ta có thể kiểm tra cách Python phân tích các toán tử so sánh chuỗi:
>>> import ast
>>> node_obj = ast.parse('"foo" < "bar" <= "baz"')
>>> ast.dump(node_obj)
"Module(body=[Expr(value=Compare(left=Str(s='foo'), ops=[Lt(), LtE()],
comparators=[Str(s='bar'), Str(s='baz')]))])"
Vì vậy, chúng ta có thể thấy rằng điều này thực sự không khó đối với Python hoặc bất kỳ ngôn ngữ nào khác để phân tích.
>>> ast.dump(node_obj, annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE()], [Str('bar'), Str('baz')]))])"
>>> ast.dump(ast.parse("'foo' < 'bar' <= 'baz' >= 'quux'"), annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE(), GtE()], [Str('bar'), Str('baz'), Str('quux')]))])"
Và trái với câu trả lời hiện đang được chấp nhận, hoạt động ternary là một hoạt động so sánh chung, lấy biểu thức đầu tiên, một phép so sánh cụ thể và một nút lặp của các nút biểu thức để đánh giá khi cần thiết. Đơn giản.
Kết luận về Python
Cá nhân tôi thấy ngữ nghĩa phạm vi khá thanh lịch và hầu hết các chuyên gia Python mà tôi biết sẽ khuyến khích việc sử dụng tính năng này, thay vì xem xét nó có hại - ngữ nghĩa được nêu khá rõ trong tài liệu có uy tín (như đã lưu ý ở trên).
Lưu ý rằng mã được đọc nhiều hơn nó được viết. Những thay đổi giúp cải thiện khả năng đọc mã nên được chấp nhận, không được giảm giá bằng cách tăng các đối tượng chung về Sợ hãi, Không chắc chắn và Nghi ngờ .
Vậy tại sao x <y <z không phổ biến trong các ngôn ngữ lập trình?
Tôi nghĩ rằng có một sự hợp lưu của các lý do xoay quanh tầm quan trọng tương đối của tính năng và động lượng / quán tính tương đối của sự thay đổi được cho phép bởi các thống đốc của các ngôn ngữ.
Các câu hỏi tương tự có thể được hỏi về các tính năng ngôn ngữ quan trọng khác
Tại sao không có nhiều kế thừa có sẵn trong Java hoặc C #? Không có câu trả lời tốt ở đây cho một trong hai câu hỏi . Có lẽ các nhà phát triển đã quá lười biếng, như Bob Martin cáo buộc, và những lý do được đưa ra chỉ là lý do. Và thừa kế nhiều là một chủ đề khá lớn trong khoa học máy tính. Nó chắc chắn quan trọng hơn chuỗi vận hành.
Giải pháp đơn giản tồn tại
Chuỗi toán tử so sánh là thanh lịch, nhưng không có nghĩa là quan trọng như nhiều kế thừa. Và cũng giống như Java và C # có giao diện như một cách giải quyết, mọi ngôn ngữ cho nhiều so sánh - bạn chỉ cần xâu chuỗi các phép so sánh với boolean "và", hoạt động đủ dễ dàng.
Hầu hết các ngôn ngữ được điều chỉnh bởi ủy ban
Hầu hết các ngôn ngữ đang phát triển bởi ủy ban (thay vì có một Nhà độc tài nhân từ hợp lý cho cuộc sống như Python có). Và tôi suy đoán rằng vấn đề này chưa thấy đủ sự hỗ trợ để đưa nó ra khỏi các ủy ban tương ứng.
Các ngôn ngữ không cung cấp tính năng này có thể thay đổi không?
Nếu một ngôn ngữ cho phép x < y < z
mà không có ngữ nghĩa toán học dự kiến, đây sẽ là một thay đổi đột phá. Nếu nó không cho phép nó ở nơi đầu tiên, nó sẽ gần như không đáng kể để thêm vào.
Thay đổi đột phá
Về các ngôn ngữ có các thay đổi vi phạm: chúng tôi cập nhật các ngôn ngữ có các thay đổi về hành vi - nhưng người dùng có xu hướng không thích điều này, đặc biệt là người dùng các tính năng có thể bị hỏng. Nếu người dùng đang dựa vào hành vi trước đây x < y < z
, họ có thể sẽ phản đối mạnh mẽ. Và vì hầu hết các ngôn ngữ được điều hành bởi ủy ban, tôi nghi ngờ chúng ta sẽ có nhiều ý chí chính trị để hỗ trợ một sự thay đổi như vậy.