Mengapa x < y < z
tidak tersedia secara umum dalam bahasa pemrograman?
Dalam jawaban ini saya menyimpulkan itu
- meskipun konstruk ini sepele untuk diterapkan dalam tata bahasa bahasa dan menciptakan nilai bagi pengguna bahasa,
- alasan utama bahwa hal ini tidak ada dalam sebagian besar bahasa adalah karena kepentingannya relatif terhadap fitur-fitur lain dan keengganan badan pengatur bahasa untuk
- mengecewakan pengguna dengan kemungkinan melanggar perubahan
- untuk pindah menerapkan fitur (yaitu: kemalasan).
pengantar
Saya bisa berbicara dari perspektif Pythonist tentang pertanyaan ini. Saya adalah pengguna bahasa dengan fitur ini dan saya suka mempelajari detail implementasi bahasa. Di luar ini, saya agak akrab dengan proses perubahan bahasa seperti C dan C ++ (standar ISO diatur oleh komite dan versi menurut tahun.) Dan saya telah menyaksikan Ruby dan Python mengimplementasikan perubahan yang melanggar.
Dokumentasi dan implementasi Python
Dari dokumen / tata bahasa, kami melihat bahwa kami dapat memadukan sejumlah ekspresi dengan operator pembanding:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
dan dokumentasi selanjutnya menyatakan:
Perbandingan dapat dirantai secara sewenang-wenang, misalnya, x <y <= z setara dengan x <y dan y <= z, kecuali bahwa y dievaluasi hanya sekali (tetapi dalam kedua kasus z tidak dievaluasi sama sekali ketika x <y ditemukan menjadi salah).
Kesetaraan logis
Begitu
result = (x < y <= z)
secara logis setara dalam hal evaluasi x
, y
dan z
, dengan pengecualian yang y
dievaluasi dua kali:
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
Sekali lagi, perbedaannya adalah bahwa y hanya dievaluasi satu kali dengan (x < y <= z)
.
(Catatan, tanda kurung sama sekali tidak perlu dan mubazir, tetapi saya menggunakannya untuk kepentingan yang berasal dari bahasa lain, dan kode di atas adalah Python yang cukup legal.)
Memeriksa Pohon Sintaks Abstrak yang diuraikan
Kita dapat memeriksa bagaimana Python mem-parsing operator perbandingan:
>>> 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')]))])"
Jadi kita dapat melihat bahwa ini sebenarnya tidak sulit untuk Python atau bahasa lain untuk diuraikan.
>>> 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')]))])"
Dan bertentangan dengan jawaban yang diterima saat ini, operasi ternary adalah operasi perbandingan generik, yang mengambil ekspresi pertama, iterable dari perbandingan spesifik dan iterable dari node ekspresi untuk mengevaluasi yang diperlukan. Sederhana.
Kesimpulan tentang Python
Saya pribadi menemukan bahwa semantik jangkauannya cukup elegan, dan sebagian besar profesional Python yang saya kenal akan mendorong penggunaan fitur ini, alih-alih menganggapnya merusak - semantiknya dinyatakan dengan jelas dalam dokumentasi terkenal (seperti disebutkan di atas).
Perhatikan bahwa kode lebih banyak dibaca daripada yang tertulis. Perubahan yang meningkatkan keterbacaan kode harus dianut, tidak diabaikan dengan meningkatkan momok umum Ketakutan, Ketidakpastian, dan Keraguan .
Jadi mengapa x <y <z tidak umum tersedia dalam bahasa pemrograman?
Saya pikir ada pertemuan alasan yang berpusat di sekitar kepentingan relatif fitur dan momentum relatif / kelembaman perubahan yang diizinkan oleh para gubernur bahasa.
Pertanyaan serupa dapat ditanyakan tentang fitur bahasa lain yang lebih penting
Mengapa pewarisan berganda tidak tersedia di Java atau C #? Tidak ada jawaban yang baik untuk pertanyaan ini . Mungkin para pengembang terlalu malas, sebagaimana ditegaskan Bob Martin, dan alasan yang diberikan hanyalah alasan. Dan multiple inheritance adalah topik yang cukup besar dalam ilmu komputer. Ini tentu saja lebih penting daripada perangkaian operator.
Ada solusi sederhana
Chaining operator pembanding adalah elegan, tetapi sama sekali tidak sepenting warisan ganda. Dan seperti halnya Java dan C # memiliki antarmuka sebagai solusi, demikian juga setiap bahasa untuk beberapa perbandingan - Anda cukup mengaitkan perbandingan dengan boolean "dan" s, yang bekerja dengan cukup mudah.
Sebagian besar bahasa diatur oleh komite
Sebagian besar bahasa berevolusi oleh komite (daripada memiliki Diktator Kebajikan Sejati yang masuk akal seperti yang dimiliki Python). Dan saya berspekulasi bahwa masalah ini hanya belum melihat cukup dukungan untuk keluar dari komite masing-masing.
Bisakah bahasa yang tidak menawarkan fitur ini berubah?
Jika suatu bahasa memungkinkan x < y < z
tanpa semantik matematika yang diharapkan, ini akan menjadi perubahan besar. Jika tidak mengizinkannya di tempat pertama, itu akan hampir sepele untuk ditambahkan.
Memecah perubahan
Mengenai bahasa dengan perubahan yang rusak: kami memperbarui bahasa dengan mengubah perubahan perilaku - tetapi pengguna cenderung tidak menyukai ini, terutama pengguna fitur yang mungkin rusak. Jika seorang pengguna mengandalkan perilaku sebelumnya x < y < z
, mereka kemungkinan besar akan protes keras. Dan karena sebagian besar bahasa diatur oleh komite, saya ragu kita akan mendapatkan banyak kemauan politik untuk mendukung perubahan semacam itu.