Bir programlama dili deyim olmadan da çalışabilir mi?


9

JavaScript'te programlama olarak, ifadelerle yapılabilecek her şeyin ve blokların sadece ifadelerle yapılabileceğini fark ettim. Bir programlama dili sadece ifadelerle iyi çalışabilir mi? Ve eğer evet ise, neden ifadeler hiç kullanılmıyor?


2
Evet, Ruby ve Lisp'in tüm lehçeleri gibi birçok ifade dili vardır.
amara

@sparkleshy Görüyorum, sadece bir tahmin: hepsi JavaScript'in virgülüne bir operatör analog var (iki ifade yürütür ve son değerini döndürür)? Bu genellikle iki ifadeyi sırayla yürütmek için bir çözüm müdür? CL'nin prognunu analog olarak sayıyorum, sanırım,> 2 ifade için çalışıyor olsa bile.
MaiaVictor

1
Her şey ifade gibidir, sıradan bir ifade dilinden farklı görünmek zorunda değildir, ifadelerin sadece değerleri vardır. Javascript'in ifadelerini ifade ettiyseniz, mevcut tüm kod tamamen geçerli olur.
amara

1
CoffeeScript , JavaScript ile derlenen her şey ifade ifadesidir.
Aralık'ta Spoike

1
related (muhtemelen yinelenen): Bir ifadenin ifade olmadığı bir dilde hangi yararlı ifade mümkün olmaz? "Cevaplarda belirtildiği gibi ifade ve stmt arasındaki farkı neden bu kadar çok dilbilgisi oluşturuyor?
gnat

Yanıtlar:


14

Elbette. En basit yol, şu anda bir ifade olan her yapıya bir sonuç değeri atamak ve böylece onu bir ifadeye dönüştürmektir. Bu mutlaka yararlı veya anlamlı değildir. Tek potansiyel kazanç biraz kavramsal basitliktir. Ancak, eğer daha sonra noktalı virgül ve döngüler gibi şeyler kaldırmak için devam (yerine diğer operatörler ve fonksiyonlar yoluyla zincirleme gerektiren), programlar ağır kullanarak ifadeleri çirkin olur.

Bunu yapmanın daha radikal ama anlamlı bir yolu, dili neredeyse her şeyin anlamlı bir değere sahip olacak şekilde tasarlamak ve onu, diğer etkiler için değil, neredeyse her zaman bu anlamlı değer için bir ifade kullanacak şekilde kullanmaktır. İşlevsel programlama dilleri bunu yapar (bir dereceye kadar; Haskell'in ifadeleri olmayan bildirimleri vardır).

İfadeler kullanılır çünkü zorunlu paradigmada, yararlı bir sonuç değerine sahip olmayan birçok yaygın işlem vardır ve sıralı talimatlar (hesaplamalar yerine) kavramı bu paradigmaya oldukça iyi uymaktadır. Programınızın büyük bir yüzdesi yeni değerleri hesaplamak yerine durumu mutasyona uğratıyorsa, bir değer üretmeyi gerektirmez (for döngüsünün sonucu nedir?). Buna karşılık, tüm paradigmanız (FP) değerlerin hesaplanması üzerine kurulduğunda, sonuç değeri olmayan aykırı değerler bir istisna gerektirmez: Bunun yerine onlara bir şey ifade etmeyen bir sentinel sonucu verirsiniz.


-1 bu gerçekten doğru değil
amara

3
@sparkleshy Hangi kısım doğru değil ve nasıl?

1
ilk paragraf: ifadelerin yararlı dönüş değerlerine sahip olduğu (ancak birçoğunun yaptığı), çirkin bir şey önerdiği (neden?) fikrinden şüphe ediyorsunuz. ikinci paragraf: tüm fonksiyonel programlama dillerinin bu çirkin saçak kavramını kullandığını beyan eder, bu saçma. üçüncü paragraf: false, zaten {} bloklarında değerin yoksayıldığını ve herhangi bir soruna neden olmadığını, yanlış; onlara zaten boşluk değerinin eksikliğini veriyorsunuz, null bundan daha az anlamlı nasıl olur? Genel olarak: bu gerçekten doğru değil
amara

2
@sparkleshy - Hiçbir ifadenin yararlı dönüş değerleri yoktur, bu yüzden ifadelerdir . Yararlı yan etkileri olabilir (atama gibi), ancak bu aynı şey değildir. Bu gerçekten bir saçak konsepti değil. N dereceye alınırsa tamamen pratik değilse iyi bilinir. Ve bu sentinel değeri null veya geçersiz değil , her ikisinden de farklı bir birim . Bunu telafi etmek için delnan için +1.
Telastyn

4
@sparkleshy (1) İfadeleri (bir ifadenin tek bileşeni olabilir) ifadeyle (ifade olmayan ve sonuç değeri olmayan) ifade ile karıştırıyor olabilirsiniz. (2) Ne? Herhangi bir FP savunucusu bunu doğrular (ve bunun iyi bir şey olduğunu iddia eder). Yoksa sadece itiraz ettiğiniz "hepsi" kısmı mı? (3) {} blokları bahsettiğim şeyler ("sıralı talimatlar kavramı"). Ve bir şeyin herhangi bir soruna neden olduğunu nereden söyleyebilirim? voidVe null/ arasındaki fark unit, ikincisinin değerler olması ve etrafından geçirilebilmesidir, oysa voidbu tipte bir değer olmaması özeldir.

5

"İfade" ve "ifade" yi nasıl tanımladığınıza bağlıdır.

Çok katı bir tanım, ifadeleri "yan etkileri olan ve belki bir dönüş değeri olan şeyler" ve ifadeleri "dönüş değerleri olan ancak yan etkileri olmayan şeyler" olarak ayırır. Böyle bir tanımla, en az bir ifade olmadan anlamlı bir program yazılamaz (bir ifadeyi değerlendirmek ve dönüş değerini çıkarmak zorunda kalır) - saf ifadeler tek başına program dışındaki dünya ile etkileşime giremez. Saf olmayan kısım dilin dışına ve destekleyici ekosisteme taşınırsa, tek başına bir dil yine de tamamen saf olabilir (yani herhangi bir ifade içermez) (dilin ifadeleri olduğu kadar tanımları da olmasına rağmen, Haskell'in yaptığı tam olarak budur) .

Bununla birlikte, ifadelerde yan etkilere izin verirseniz, ifadeler ve ifadeler arasındaki ayrım keyfi ve çok daha az ilginç hale gelir - elbette sadece ifadelerden oluşan bir programlama dili icat edebilirsiniz; Lisp lehçelerinin çoğu böyle çalışır. Böyle bir durumda, bir ifadeyi yan etkileri için değerlendirmek, bir ifadeyi yürütmekle hemen hemen aynıdır ve böyle bir dilde ifadelerin ve ifadelerin aynı şey olduğu iddia edilebilir. Bir ifade ile bir ifade arasındaki fark sadece sözdizimseldir.

Birçok dil hala bu sözdizimsel ayrımı yapmaktadır, çünkü teknik nedenlerle değil, okunabilirlik açısından yararlıdır. Bir şeyi ifade etmek, dönüş değeriyle ilgilendiğinizi gösterir, yan etkileri daha azdır; bunu ifade etmek okuyucuya yan etkilere neden olmayı düşündüğünüzü söyler ve dönüş değeri ilginç olabilir veya olmayabilir.


Okunabilirlik hakkındaki yorumlar için +1 ... Sonunda, insanların anlaması gerekiyor ...
mattnz

1

ATL ve Xtend ifadesiz iyi çalışan programlama dilleridir. Birçok işlevsel dil de ifadesizdir. Yani, evet bir programlama dili deyim olmadan düzgün çalışabilir. Bence ifadeler birçok dilde zorunlu programlamanın bir kalıntısı. Halen yaygın olarak tanındıklarından ve bazı durumlarda kodu daha okunabilir hale getirdikleri için hala kullanılmaktadırlar.


1

Evet.

İşlevsel diller (ve tekli atama dilleri) her şey bir ifadedir. Örnekler Haskal (ve SISAL). Burada hem if ifadeleri hem de döngüler için değer döndürür.

Başka dil sınıfları da var: Akla yayılan en kolay dil bildirimsel dillerdir (eminim ifadelere bağlı olmayan başkaları da vardır). Bu dillerin ifadelere bile ihtiyacı yoktur (normalde düşündüğünüz anlamda). Neyin doğru olduğunu beyan edersiniz ve birden çok sonuç elde edebilirsiniz. Buradaki kolay olan prolog.


Haskell'in beyanları var, bunlar ifade değil.
Janus Troelsen
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.