Infix operatörleri bir programlama dilinde ne kadar yararlıdır?


13

Infix operatörleri bir programlama dilinde ne kadar yararlıdır? Sağladıkları ekstra karmaşıklığa değer mi? Infix operatörlerinin, sadece normal operatörleri aşırı yükleyerek çözülemeyecek problem için daha uygun olduğu herhangi bir örnek verebilir misiniz?


5
Lisper olmalısın. Haklı mıyım?
missingfaktor

@missingfaktor: Zar zor kullanılmış
Casebash

1
Infix operatörleri operatör aşırı yüklemesi ile nasıl ilişkilidir?
Rein Henrichs

3
Popüler OO (ish) dillerinin çoğunun yöntem adları için infix kullandığını belirtmek gerekir. Gerçekten de, bazı diller "statik" yöntemlerin, örneğin arg1.method(arg2)yerine yazılmasına izin vermek için belirli bir uzunluğa sahiptir method(arg1, arg2).
Tom Hawtin - tackline

Yanıtlar:


16

Bence infix operatörleri matematikten kaynaklanıyor.

Bu:

2 + 3 * 4

çoğu insan için daha okunabilir

(+ 2 (* 3 4))

çünkü çoğu insan matematiğe aşinadır.

Haskell'de yeterince ilginç olan infix ve önek arasında atlayabilirsiniz. Bu aynı işlev "(+)" kullanıyor:

(+) 1 2
1 + 2

ve bu aynı "elem" fonksiyonunu kullanıyor:

elem 42 [1,2,42]
42 `elem` [1,2,42]

Aşırı yükleme normal operatörleri bu
durumun

1
@Casebash: Bu "normal" operatörler bazen de takılır.
liori

2
Bundan daha garip olmalıyım, çünkü (+ 1 2) daha okunabilir buluyorum 1 + 2. En azından (+ 1 2 3 4 5)daha iyidir 1 + 2 + 3 + 4 + 5.
Joe D

Ayrıca RPN var: elemanları itin, sonra operatörü.
PhiLho

@PhiLho Postfix operatörleri de denir! Bunun gibi: 1 2 +veya 1 2 3 4 5 +daha tipik olarak son durum için 1 2 + 3 + 4 + 5 +. Aslında yığın tabanlı bir sistemi mükemmel bir şekilde modellediğinden ve operatörün önceliğini ayarlamak için nadiren (eğer varsa?) Parantezlere ihtiyaç duyduğu için gerçek bir avantaj var.
CodexArcanum

6

Bilgisayar dilleri makineler için değil insanlar için tasarlanmıştır. Ve insanlar operatörleri sabitlemek için ön veya son düzeltmelerden daha çok kullanılır.


6

Infix operatörlerinin tek gerçek nedeni, insanların genellikle onları okumayı daha kolay bulmasıdır. Bu büyük ölçüde iki gerçekten kaynaklanmaktadır:

  • Infix operatörlerini erken yaştan itibaren matematik şeklinde öğreniriz ve dolayısıyla onlara aşinayız: 2 * 2 = 4vb.
  • Bir infix operatörü iki argümanı "görsel olarak" ayırma avantajına sahiptir. Örneğin(some complex expression) + (some other complex expression)

Mantıksal / makine perspektifinden, infix operatörleri gerçekten herhangi bir değer katmaz ve bazı durumlarda bir sıkıntı vardır:

  • Infix'ten her zaman iki argümanla eşdeğer bir işlev çağrısına dönüştürebilirsiniz - bu nedenle infix operatörleri asla "sözdizimsel şeker" ten daha fazla değildir
  • İkiden fazla parametre kullanmak istediğinizde infix elverişsiz olabilir. (* 1 2 3 4 5)Örneğin Lisp'de tartışmasız bir sayı kümesini çarpmak için çok daha temiz bir sözdizimidir.
  • Ayrıştırma perspektifinden bakıldığında, ifadenin kalanını nasıl yorumlayacağınızı bilmeniz için önce operatörü okumak genellikle yararlıdır. Infix operatörleri ile bu çok daha karmaşık olabilir (örneğin, hangi operatörün hangi argümanlara uygulandığını anlamaya benzer bir yığın veya benzeri bir şey bulundurmanız gerekir)
  • Forth gibi yığın tabanlı / birleşik dillerde, operatörün yığının en son üzerine itilmesini istersiniz, böylece argümanları zaten doğru konumda olur. Yine, operatörü bir token dizisinin ortasına gömmek sadece işleri karmaşıklaştırır.
  • Infix operatörleri aşırı yüklendiğinde gerçekten kafa karıştırıcı olabilir - örneğin iki + HashMaps'e uygulandığında "+" ne anlama gelir? Burada, infix operatörünün sezgisel insan anlayışı size karşı çalışır çünkü aslında amaçlanmayan bir anlam kabul etmek kolaydır .....

Bence son argüman sahte. İster semboller ister harfler kullanın, fonksiyonlar için anlamlı isimler kullanmak programcıya bağlıdır.
Tom Hawtin - çakmak hattı

@Tom - elbette, programcılar mantıklı isimler seçmelidir. Ama "mantıklı" için anahtar kriterlerden biri "diğer insanlar bunu sezgisel olarak anlayabilir mi?" - Operatörün aşırı yükte olduğu durumdan çok fazla olduğu durumlarda çok sayıda vaka gördüm. Bazı rastgele veri türlerine uygulandığında birinin ">> =" ne anlama geldiğini anlamak için tersine mühendislik yapmak istemiyorum. Uygun fonksiyon isimleri lütfen!
mikera
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.