S ifadeleri okunabilirliği


9

Özetle ve bunu bilmeyenler için Lisp fonksiyonları / operatörleri / yapıları aynı şekilde denir:

(function arg0 arg1 ... argN)

Peki C benzeri bir dilde,

if (a > b && foo(param))

gibi bir Lisp sexp dönüştü

(if (and (> a b) (foo param)))

. İşler daha gerçek / karmaşık hale geldikçe, benim için karşılık gelen s ifadeleri de.

Bunun büyük olasılıkla öznel bir soru olduğunun farkındayım, ama - birçok Lisp bilgisayar korsanı için bu, her zaman uğraşması gereken küçük bir sıkıntı mı?

Yoksa er ya da geç bu sözdizimine çoğunlukla alışıyor mu?

Her durumda, okunabilirlik için kesme çizgileri (çoğu zaman C eşdeğerinize eklemeyeceğiniz) eklemek, özellikle uzun vadede iyi bir fikir midir? Başka herhangi bir öneri memnuniyetle karşılanacaktır.


1
Lisp'i emac gibi Lisp kullanan bir ortamda kullanmayı denediniz mi? Başka bir şekilde dokunmazdım.
David Thornley

Hayır, Lisp deneyimimi hangi şekillerde geliştirebilirim?
vemv

kısa fonksiyonlar yazmak da çok önemlidir, ancak sadece clojure ile oynadım.
Kevin

3
İyi bir Lisp ortamında parantezleri görmezden gelir ve yapıyı girinti ile okursunuz. Fark ettiğiniz gibi, parantezleri sayarak yapıyı okumak gerçekten, gerçekten sinir bozucu.
David Thornley

Yanıtlar:


8

Nasıl ayrışırsın

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

Ayrıştırma ağacı muhtemelen

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

hmm ... hadi bu ağacı listeye serelim, ön ek gösterimi

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

Bu ayrıştırma ağacı biçiminin kullanımı oldukça kolaydır, ancak bir sorunum var. Ayırıcılardan nefret ediyorum. Sonlandırıcıları severim. Aynı zamanda boşlukta serpmeyi seviyorum.

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

hmm ... ek boşluk bazı şeyleri ayrıştırmayı zorlaştırıyor ... Belki de sadece ağacın (kök yaprak yaprak yaprağı) olarak temsil edildiği bir kural yapabilirim.

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

Şimdi bir Çözümleme ağacının benim seri olan lisp (uygulamak için yeniden adlandırma işlevi ve bu muhtemelen çalışır). Program yazan programlar istiyorsam, ayrıştırma ağaçlarını manipüle etmek çok hoş.

Bu tamamen s-ifadelerinin nasıl ortaya çıktığı değil, erken teşhis edildi ve lisp programcılarının kullandığı bir özellik. Programlarımız bir anlamda önceden ayrıştırılmıştır ve formatları nedeniyle programları değiştirmek için program yazmak oldukça kolaydır. Bu yüzden sözdiziminin eksikliği bazen bir güç olarak kabul edilir.

Ama David'in dediği gibi, s-ifade farkında bir editör kullanın. Bir s ifadesinde kapanış ayracı izini kaybetme olasılığınız, xml'de bir kapanış ayracıdır ( </foo>yalnızca kapanır <foo>, ancak sağ paren HERHANGİ bir s ifadesini kapatır). Rakette, iyi girinti stili ile birleştiğinde bazı ifadeler için köşeli parantez kullanımı çoğu sorunu çözer.

Lisp sürümü:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

Çok kötü değil.


Listeler şüphesiz expr + ifadelerinden daha çok yönlü ve güçlüdür. Emacs'ı denemek (ya da başka bir şey?) Cazip ama son denediğimde beni çok korkuttu. Sexp farkındalığı tam olarak ne getiriyor?
vemv

Basit şeyler: yakın ve açık parenlerde vurgu yaparlar (veya tüm s ifadelerini farklı şekilde vurgularlar). Güzel girintileme kuralları var. Emacs'ın başka şeyleri var, ancak okunabilirlik için muhtemelen önemli değiller. Başka s-ifade farkında editörler var. Emac'lere ihtiyacınız yok . Emacs sizi korkutursa, metin arkadaşı, yüce vb. İçin paketleri deneyin. Editörünüz okunabilirliğe yardımcı olmaya başladığında, işler biraz daha kolay hale gelir. Parçacıkların kullanılabileceği her yerde köşeli parantezlere izin veren çoğu raket malzemesini rakette yaparım. Geçiş yapabilmek okunabilirliğe yardımcı olur.
ccoakley

1
Bir kenara, iç içe geçmiş izinleri, tanımları, vb. Kullanın, bu şeyleri daha küçük parçalara ayırın. Eğer bir yığın için iyi bir isim bulamazsanız, bunu tasarımınız hakkında bir uyarı olarak kabul edin. Adından çok küçük ve okunamayacak kadar büyük arasındaki dengeyi bulun.
ccoakley

Ah bu son tavsiye ... unutulmaz :) Bunu yazarken Yüce deniyorum.
vemv

5

S-exp hakkında gerçekten güzel olan şey, kısa bir süre sonra artık onları görmüyorsunuz, gözlerinize piton gibi ama AMA bilgisayarda hala ağaç var.

  • Yani girinti otomatiktir, belirsizlik yoktur, bir bloğu bitirmek istediğinizde sekmeye iki kez basmak zorunda kalmazsınız.

  • Rastgele bir kod seçerseniz, en sevdiğiniz editörden sadece bir komutla her şey kolayca girintili

  • Kodunuzda gerçekten kolayca gezinebilir , s-exp arasında geçiş yapabilir, iyi bir düzenleyici ile değiştirebilirsiniz.

Ayrıca, manipüle ettiğiniz veriler yazdığınız kodla aynı olduğundan, kodunuzu değiştirmek için aynı dili kullanabilirsiniz?

Bunu yapabilirsiniz, makrolar budur, yazdığınız kodu diğer listeler gibi değerlendirilmeden önce manipüle edersiniz, bu yüzden Lisp'in bir "Programlanabilir Programlama Dili" olduğu söylenir. Kodunuzu sizin için yazan bir kod yazarsınız.

İşte Lisp'in doğasını ve Lisp programcılarının XML gördüklerinde neden sırıttığını anlatan güzel bir makale.

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.