x < y < z
Programlama dillerinde neden yaygın olarak bulunmuyor?
Bu cevapta ben sonuç
- Her ne kadar bu yapı bir dilin gramerinde uygulamak için önemsiz olsa da ve dil kullanıcıları için değer yaratıyorsa,
- Bunun pek çok dilde bulunmamasının temel nedenleri, diğer özelliklere göre öneminden ve dillerin yönetim organlarından birinin isteksizliğinden kaynaklanmaktadır.
- Potansiyel olarak kırılma değişiklikleri olan kullanıcıları üz
- Özelliği uygulamak için hareket etmek (örneğin: tembellik).
Giriş
Bu konuda bir Pythonist'in bakış açısından konuşabilirim. Bu özelliği olan bir dilin kullanıcısıyım ve dilin uygulama ayrıntılarını incelemeyi seviyorum. Bunun ötesinde, C ve C ++ gibi dilleri değiştirme sürecine biraz aşina oldum (ISO standardı komite tarafından yönetiliyor ve yıllara göre uyarlanıyor.) Ve hem Ruby hem de Python'un kırılma değişiklikleri gerçekleştirmesini izledim.
Python'un dokümantasyonu ve uygulaması
Dokümanlar / gramerden, karşılaştırma operatörleriyle istediğiniz sayıda ifadeyi zincirleyebileceğimizi görüyoruz:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
ve belgeler ayrıca şunları belirtir:
Karşılaştırmalar keyfi bir şekilde zincirlenebilir, örneğin, x <y <= z, x <y ve y <= z'ye eşittir, ancak y yalnızca bir kez değerlendirilir (ancak her iki durumda da z, x <y bulunduğunda hiç değerlendirilmez) yanlış olmak için).
Mantıksal Eşdeğerlik
Yani
result = (x < y <= z)
mantıksal olan eşdeğer değerlendirilmesi açısından x
, y
ve z
dışında, y
iki kez değerlendirilir:
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
Yine fark, y'nin yalnızca bir kez değerlendirildiğidir (x < y <= z)
.
(Not: Parantezler tamamen gereksiz ve gereksizdir, ancak bunları diğer dillerden gelenlerin yararına kullandım ve yukarıdaki kod oldukça yasal Python'dur.)
Ayrıştırılmış Soyut Sözdizimi Ağacını İnceleme
Python'un zincirleme karşılaştırma işleçlerini nasıl ayrıştırdığını inceleyebiliriz:
>>> 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')]))])"
Böylece Python veya başka bir dilin ayrıştırılması için bunun gerçekten zor olmadığını görebiliyoruz.
>>> 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')]))])"
Ve şu anda kabul edilen cevabın aksine, üçlü işlem, ilk ifadeyi alan, belirli karşılaştırmaların yinelemeli ve gerektiği gibi değerlendirmek için ifade düğümlerinin yinelenebilen genel bir karşılaştırma işlemidir. Basit.
Python Üzerine Sonuç
Kişisel olarak anlam semantiklerini oldukça şık buluyorum ve tanıdığım çoğu Python uzmanı, zarar vermeyi düşünmek yerine, özelliğin kullanımını teşvik edecektir - anlambilim, tanınmış belgelerde (yukarıda belirtildiği gibi) oldukça açık bir şekilde belirtilmiştir.
Kodun yazıldığından çok daha fazla okunduğunu unutmayın. Kodun okunabilirliğini artıran değişiklikler, Korku, Belirsizlik ve Şüphe'nin jenerik hayaletlerini artırarak indirgenmemelidir .
Öyleyse neden programlama dillerinde x <y <z yaygın olarak bulunmuyor?
Özelliğin göreceli önemine ve dil valilerinin izin verdiği değişimin göreceli momentum / ataletine odaklanan nedenlerin bir birleşimi olduğunu düşünüyorum.
Diğer daha önemli dil özellikleri için de benzer sorular sorulabilir.
Neden Java veya C # ile birden fazla devralma mevcut değil? Her iki soruya da iyi bir cevap yok . Belki de Bob Martin’in iddia ettiği gibi geliştiriciler çok tembeldi ve verilen sebepler sadece bahaneler. Ve çoklu kalıtım, bilgisayar bilimlerinde oldukça büyük bir konudur. Operatör zincirlemesinden kesinlikle daha önemlidir.
Basit geçici çözümler var
Karşılaştırma operatörü zincirleme zarif, ancak hiçbir şekilde çoklu kalıtım kadar önemli değildir. Ve Java ve C # 'nin bir geçici çözüm olarak arayüzleri olduğu gibi, çoklu dil karşılaştırmaları için her dilin yaptığı gibi - kolayca ve basit bir şekilde çalışan Boolean "ve" s ile yapılan karşılaştırmaları zincirlemelisiniz.
Çoğu dil komite tarafından yönetilir
Çoğu dil, komite tarafından gelişmektedir (Python'daki gibi makul bir Benevolent For Life Diktatörüne sahip olmak yerine). Ve bu konunun ilgili komitelerinden çıkarmak için yeterli destek görmediğini düşünüyorum.
Bu özelliği sunmayan diller değişebilir mi?
Bir dil x < y < z
beklenen matematiksel anlambilim olmadan izin verirse , bu kırıcı bir değişiklik olur. İlk etapta izin vermediyse, eklemek neredeyse önemsiz olurdu.
Değişiklikleri kırmak
Değişen değişiklikler içeren dillerle ilgili: Değişen davranış değişiklikleriyle dilleri güncelleriz - ancak kullanıcılar bundan hoşlanmaz, özellikle de kırılabilecek özellikler kullanıcıları. Bir kullanıcı önceki davranışına güveniyorsa, x < y < z
muhtemelen yüksek sesle protesto ederdi. Ve çoğu dil komite tarafından yönetildiğinden, böyle bir değişikliği desteklemek için çok fazla siyasi irade alacağımızdan şüpheliyim.