เหตุใดจึงx < y < z
ไม่มีอยู่ทั่วไปในภาษาการเขียนโปรแกรม
ในคำตอบนี้ฉันสรุปได้ว่า
- แม้ว่าโครงสร้างนี้เป็นเรื่องเล็กน้อยที่จะนำไปใช้ในไวยากรณ์ของภาษาและสร้างคุณค่าให้กับผู้ใช้ภาษา
- เหตุผลหลักที่ว่าสิ่งนี้ไม่ได้มีอยู่ในภาษาส่วนใหญ่เกิดจากความสำคัญของมันที่เกี่ยวข้องกับคุณสมบัติอื่น ๆ และความไม่เต็มใจของหน่วยงานการปกครองของภาษาทั้ง
- ทำให้ผู้ใช้อารมณ์เสียด้วยการเปลี่ยนแปลงที่อาจเกิดขึ้น
- เพื่อย้ายไปใช้คุณลักษณะ (เช่น: ความเกียจคร้าน)
บทนำ
ฉันสามารถพูดได้จากมุมมองของ Pythonist กับคำถามนี้ ฉันเป็นผู้ใช้ภาษาที่มีคุณสมบัตินี้และฉันชอบศึกษารายละเอียดการใช้ภาษา นอกเหนือจากนี้ฉันค่อนข้างคุ้นเคยกับกระบวนการเปลี่ยนภาษาเช่น C และ C ++ (มาตรฐาน ISO อยู่ภายใต้การควบคุมของคณะกรรมการและเวอร์ชันปี) และฉันได้ดูทั้ง Ruby และ Python ใช้การเปลี่ยนแปลงที่ทำลาย
เอกสารและการใช้งานของไพ ธ อน
จากเอกสาร / ไวยากรณ์เราเห็นว่าเราสามารถเชื่อมโยงนิพจน์จำนวนเท่าใดก็ได้กับตัวดำเนินการเปรียบเทียบ:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
และเอกสารประกอบระบุเพิ่มเติม:
การเปรียบเทียบสามารถถูกล่ามโซ่โดยพลการตัวอย่างเช่น x <y <= z เทียบเท่ากับ x <y และ y <= z ยกเว้นว่า y ถูกประเมินเพียงครั้งเดียว (แต่ในทั้งสองกรณี z ไม่ได้รับการประเมินเลยเมื่อพบ x <y เป็นเท็จ)
สมการเชิงตรรกะ
ดังนั้น
result = (x < y <= z)
เป็นเหตุผลเทียบเท่าในแง่ของการประเมินผลของx
, y
และz
มีข้อยกเว้นที่y
ได้รับการประเมินครั้งที่สอง:
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
(x < y <= z)
อีกครั้งที่แตกต่างคือปีได้รับการประเมินเพียงครั้งเดียวด้วย
(หมายเหตุวงเล็บไม่จำเป็นและซ้ำซ้อน แต่ฉันใช้มันเพื่อประโยชน์ของผู้ที่มาจากภาษาอื่นและรหัสข้างต้นค่อนข้างถูกต้องตามกฎหมายของ Python)
การตรวจสอบทรีไวยากรณ์แยกวิเคราะห์
เราสามารถตรวจสอบว่า Python แยกวิเคราะห์ตัวดำเนินการเปรียบเทียบที่ถูกโยงโซ่:
>>> 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')]))])"
ดังนั้นเราจะเห็นได้ว่านี่ไม่ใช่เรื่องยากที่ Python หรือภาษาอื่นจะแยกวิเคราะห์
>>> 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')]))])"
ตรงกันข้ามกับคำตอบที่ยอมรับในปัจจุบันการดำเนินการแบบไตรภาคเป็นการดำเนินการเปรียบเทียบทั่วไปที่ใช้นิพจน์แรกการวนซ้ำของการเปรียบเทียบที่เฉพาะเจาะจงและการวนซ้ำของโหนดการแสดงออกเพื่อประเมินตามความจำเป็น ง่าย
บทสรุปเกี่ยวกับ Python
ฉันพบว่าความหมายของช่วงนั้นค่อนข้างจะหรูหราและผู้เชี่ยวชาญ Python ส่วนใหญ่ที่ฉันรู้จักจะสนับสนุนการใช้งานคุณลักษณะนี้แทนที่จะพิจารณาว่าเป็นความเสียหาย - ความหมายนั้นมีการระบุไว้อย่างชัดเจนในเอกสารที่มีชื่อเสียง
โปรดทราบว่ามีการอ่านรหัสมากกว่าที่เขียนไว้ การเปลี่ยนแปลงที่ปรับปรุงการอ่านรหัสที่ควรได้รับการกอดไม่ลดโดยการเพิ่มภูตผีทั่วไปของความกลัวความไม่แน่นอนและไม่ต้องสงสัยเลย
แล้วเหตุใด x <y <z จึงไม่มีอยู่ทั่วไปในภาษาการเขียนโปรแกรม
ฉันคิดว่ามีการรวมกันของเหตุผลที่มุ่งเน้นไปที่ความสำคัญของคุณลักษณะและโมเมนตัม / ความเฉื่อยของการเปลี่ยนแปลงที่ได้รับอนุญาตโดยผู้ว่าราชการของภาษา
คำถามที่คล้ายกันสามารถถามเกี่ยวกับคุณสมบัติภาษาที่สำคัญอื่น ๆ
เหตุใดจึงไม่มีการสืบทอดหลายรายการใน Java หรือ C # ไม่มีคำตอบที่ดีสำหรับคำถามนี้ บางทีนักพัฒนาอาจขี้เกียจเกินไปอย่างที่บ็อบมาร์ตินอ้างเหตุผลและเหตุผลก็เป็นข้อแก้ตัว และการสืบทอดหลายครั้งเป็นหัวข้อที่ยิ่งใหญ่ในสาขาวิทยาศาสตร์คอมพิวเตอร์ มีความสำคัญมากกว่าการผูกมัดผู้ปฏิบัติงานอย่างแน่นอน
มีวิธีแก้ไขปัญหาง่าย ๆ อยู่
การโยงผู้ประกอบการเปรียบเทียบนั้นสง่างาม แต่ก็ไม่สำคัญเท่ากับมรดกหลายอย่าง และเช่นเดียวกับ Java และ C # มีอินเทอร์เฟซเป็นวิธีแก้ปัญหาดังนั้นทุกภาษาสำหรับการเปรียบเทียบหลาย ๆ ครั้ง - คุณเพียงเชื่อมโยงการเปรียบเทียบกับบูลีน "และ" s ซึ่งทำงานได้ง่ายพอ
ภาษาส่วนใหญ่ควบคุมโดยคณะกรรมการ
ภาษาส่วนใหญ่มีการพัฒนาโดยคณะกรรมการ (แทนที่จะมีเผด็จการใจดีสำหรับชีวิตเหมือนงูใหญ่มี) และฉันคาดการณ์ว่าปัญหานี้เพิ่งไม่ได้เห็นการสนับสนุนเพียงพอที่จะทำให้มันออกมาจากคณะกรรมการที่เกี่ยวข้อง
ภาษาที่ไม่มีคุณสมบัตินี้สามารถเปลี่ยนแปลงได้หรือไม่?
หากภาษายอมให้x < y < z
ไม่มีความหมายทางคณิตศาสตร์ที่คาดหวังนี่จะเป็นการเปลี่ยนแปลงที่ไม่คาดคิด หากไม่อนุญาตให้ใช้ในตอนแรกมันจะเพิ่มขึ้นเล็กน้อย
ทำลายการเปลี่ยนแปลง
เกี่ยวกับภาษาที่มีการเปลี่ยนแปลงที่ไม่หยุดยั้ง: เราอัปเดตภาษาที่มีการเปลี่ยนแปลงพฤติกรรมที่ไม่ปกติ - แต่ผู้ใช้มักจะไม่ชอบสิ่งนี้โดยเฉพาะผู้ใช้คุณสมบัติที่อาจใช้งานไม่ได้ หากผู้ใช้พึ่งพาพฤติกรรมเดิมของx < y < z
พวกเขาก็น่าจะประท้วงดัง และเนื่องจากภาษาส่วนใหญ่อยู่ภายใต้การควบคุมของคณะกรรมการฉันสงสัยว่าเราจะได้รับเจตจำนงทางการเมืองมากมายเพื่อสนับสนุนการเปลี่ยนแปลงดังกล่าว