Clojure, Scheme / Racket ve Common Lisp arasındaki farklar nelerdir?


120

Lisp adı verilen aynı dil ailesinin lehçeleri olduklarını biliyorum, ama tam olarak ne farklar? Mümkünse sözdizimi, özellikler, özellikler ve kaynaklar gibi konuları kapsayan bir genel bakış verebilir misiniz?


3
Farklılıklara daha genel bir bakış istiyorum çünkü bu sorunun diğer birçok insan için faydalı olabileceğini düşündüm, eğer kulağa taciz edici geliyorsa üzgünüm.
MaiaVictor

4
Hangi gönderinin nereye gitmesi gerektiği konusunda hep kafam karışıyor. Bu araçlarla ilgili bir tartışma, bu yüzden buradaki veya programcılar için bir soru mu? Mantıksal olarak, bunu programcılara taşıyın derim, çünkü belirli bir sorunu çözmeyi istemiyor, ancak iyi bir cevabı olan iyi bir gönderi IMHO.
octopusgrabbus

1
@octopusgrabbus: Soru çok geniş. Üç programlama dilini 'sözdizimi, özellikler, özellikler ve kaynaklar' ile karşılaştırmak, bir kitabı veya web sitesini kolayca doldurabilir. Stackoverflow, programlama sorunları olan kişiler içindir, bir ansiklopedi (Wikipedia) değildir, genel bir tartışma forumu (Usenet) değildir, bir dil karşılaştırma sitesi değildir ( rosettacode.org ). Sorunun koda sahip olduğu ve yanıtların da koda sahip olduğu gerçek programlama problemi için en iyisidir. Artı: Birisi sıkıldı diye veya bu bir hobi diye sorun uydurmayın.
Rainer Joswig

3
Sorunun geniş olması buraya ait olmadığı anlamına gelmez. Bu tamamen açık bir soru ve kesinlikle "gerçek bir programlama sorusu". StackOverflow, öncelikle Soru-Cevap formatı aracılığıyla programlama hakkında bilgi paylaşmak için [googleable] bir topluluk kaynağı olarak tasarlanmıştır.
Dan Burton

@RainerJoswig, son günlerde bu diller hakkında öğrendiğim her şeyi yazabilirdim, ama bu iş parçacığını büyütür. İnsanların bu tür kısa cümleleri Google'da araştıracağını ve cevabı alamayacaklarını fark ettiğinizde bu gerçekten kötüdür çünkü büyük bir metin, sorulan şeyi hızlı bir şekilde anlamalarını engeller. Bu şekilde yapmak, çok daha fazla insana iyi bir cevapla yardım edilmesini sağlar.
MaiaVictor

Yanıtlar:


103

Hepsinin birçok ortak noktası var:

  • Dinamik diller
  • Kesinlikle yazılmış
  • Derleyen
  • Lisp tarzı sözdizimi, yani kod bir Lisp veri yapıları (formları) olarak yazılır ve en yaygın model aşağıdaki gibi işlev çağrılarıdır: (function-name arg1 arg2)
  • Kodu veri olarak ele almanıza ve çalışma zamanında rastgele kod oluşturmanıza olanak tanıyan güçlü makro sistemleri (genellikle yeni sözdizimiyle "dili genişletmek" veya DSL'ler oluşturmak için kullanılır)
  • Diğer paradigmalara uyum sağlama yeteneğine sahip olmasına rağmen, genellikle işlevsel programlama tarzında kullanılır
  • Bir REPL ile etkileşimli geliştirmede vurgu (yani, kodun çalışan bir örneğinde etkileşimli olarak geliştirirsiniz)

Common Lisp'in ayırt edici özellikleri:

Clojure'un ayırt edici özellikleri:

  • Herhangi bir Java kitaplığını doğrudan kullanabildiğiniz için en büyük kitaplık ekosistemi
  • Standart listelere ek olarak standart olarak kullanılan vektörler []ve haritalar - vektörlerin ve haritaların genel kullanışlılığına ek olarak, bazıları bunun genel olarak daha okunabilir kılan bir yenilik olduğuna inanıyor{}()
  • Biraz Haskell'den esinlenerek, değişmezlik ve tembel işlevsel programlamaya daha fazla vurgu
  • Yazılım işlem belleği tarafından dil düzeyinde desteklenen güçlü eşzamanlılık yetenekleri (izlemeye değer: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Şema ayırt edici özellikler:

  • Muhtemelen Lisp'i öğrenmesi en basit ve en kolay olanı
  • Hijyenik makrolar (bkz. Http://en.wikipedia.org/wiki/Hygienic_macro ) - makro genişletmelerde yanlışlıkla simge yakalama ile ilgili sorunları zarif bir şekilde önler

11
bu iyidir, ancak belki de raketin "sadece" şemadan daha fazlası olduğunu söylemelisiniz; birden çok (ancak ilişkili) dili destekleyen bir sistemdir (kendi dilinizi bile tanımlayabilirsiniz). ayrıca, clojure, oo benzeri programlama yapmanın çeşitli yollarına sahiptir (hem belirsiz bir şekilde clos'a benzeyen çoklu bir gönderim yaklaşımı hem de jvm'de daha verimli olan java'ya daha yakın bir şey). ve şema, raketin desteklediği r6rs ile daha standart kitaplıklara (oo da dahil) doğru ilerliyor.
andrew cooke

2
"Kesin yazılmış dinamik dil" pazarlamadır. Bu anlamda Python bile güçlü bir şekilde yazılmıştır.
ron

16
@ron: Python , Lisp gibi güçlü bir şekilde yazılmıştır (Javascript veya VB'den farklı olarak). Bunun yerine "statik yazmayı" ve "dinamik yazmayı" düşünüyorsunuz, tüm çeşitler için bkz. En.wikipedia.org/wiki/Type_system . Ama evet, bu pazarlama
Nas Banov

2
Ben de bu cevaba Racket'in eklenmesinin iyi olacağını düşünüyorum. Topluluk ve dilin odağı nedeniyle Racket'in Scheme'den daha kolay öğrenilebileceğini düşünüyorum. Racket (eski adı PLT Şeması), Lisp / Scheme ailesinde genel amaçlı, çok paradigmalı bir programlama dilidir. Tasarım hedeflerinden biri, dil oluşturma, tasarım ve uygulama için bir platform görevi görmektir.
mtelesha

Clojure, hijyenik makrolara sahiptir. Daha fazla bilgi burada: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff

50

Yukarıdaki insanlar bir kaç şeyi kaçırdı

  1. Common Lisp'de vektörler ve hash tabloları da vardır. Aradaki fark, Common Lisp'in vektörler için # () kullanması ve karma tablolar için sözdizimi olmamasıdır. Şemanın vektörleri var, inanıyorum

  2. Common Lisp, yeni parantezleri kullanmanıza izin veren okuyucu makrolarına sahiptir (Scheme'nin soyundan gelen Racket gibi).

  3. Scheme ve Clojure, Common Lisp'in hijyenik olmayan makrolarının aksine hijyenik makrolara sahiptir.

  4. Tüm diller ya moderndir ya da kapsamlı yenileme projelerine sahiptir. Common Lisp son beş yılda (çoğunlukla Quicklisp sayesinde) kapsamlı kitaplıklar edinmiştir, Scheme bazı modern uygulamalara sahiptir (Racket, Chicken, Chez Scheme, vb.) Ve Clojure nispeten yakın zamanda oluşturulmuştur.

  5. Common Lisp, kullanmış olabileceğiniz diğer OO sistemlerinden oldukça farklı olsa da yerleşik bir OO sistemine sahiptir. Özellikle, bu zorlanmaz - sen yok olması OO kod yazmak.

  6. Dillerin biraz farklı tasarım felsefeleri var. Şema, Aktör Modeli'ni anlamak için minimal bir lehçe olarak tasarlandı; daha sonra pedagoji için kullanıldı. Common Lisp, ortaya çıkan sayısız Lisp lehçesini birleştirmek için tasarlandı. Clojure eşzamanlılık için tasarlanmıştır. Sonuç olarak Scheme, minimal ve zarif olma, Common Lisp'in güçlü ve paradigma-agnostik olma (işlevsel, OO, her neyse) ve Clojure'un işlevsel programlamayı tercih etme konusunda bir üne sahiptir.


4
Racket, uyumluluk modları dışında bir Scheme uygulaması değildir . Bkz stackoverflow.com/questions/3345397
bug

Clojure yok değil zor yoldan bulduk olarak, hijyenik makro var.
pyon

40

Lisp-1 ve Lisp-2 farklılıklarını unutmayın.

Scheme ve Clojure Lisp-1'dir:
Bu, hem değişkenlerin hem de işlevlerin adlarının aynı ad alanında bulunduğu anlamına gelir.

Common Lisp Lisp-2'dir:
Fonksiyon ve değişkenler farklı ad alanlarına sahiptir (aslında, CL'nin birçok ad alanı vardır).


-4

Gimp, Scheme'de yazılmıştır :)

Aslında, bazılarının C ++ ile yazılabileceğini düşündüğü yazılımın tahsisi muhtemelen Lisp şemsiyesi altında yapıldı, altın elmaları gruptan ayırmak zor. Gerçek şu ki, C ++ her zaman popüler değildi, sadece güncellemeler geçmişi nedeniyle bugün popüler görünüyor. Yüzyılın daha küçük yarısı için C ++ çoklu iş parçacığı kullanmadı bile, Python bugün işe yaramaz test edilmemiş hatalı yapıştırıcı kodunun bir fosseptik olduğu yerdi. Biraz daha hızlı ilerliyor ve şimdi işlevsel programlamada bir artış görüyoruz, bu daha çok uyum sağlamak veya ölmek gibi. Bence Java'nın uyarlama kısmı söz konusu olduğunda haklı.

Scheme, Lisp dilini basitleştirmek için tasarlandı, bu onun tek amacı hiçbir zaman gerçekten yakalanmaması dışında buydu. Bence Clojure, JVM için Scheme'i basitleştirme amacına benzer bir şey yapıyor. Tıpkı diğer tüm JVM dilleri gibi, kullanıcı deneyimini şişirmek için, yalnızca Java ülkesinde ortak metin yazmayı basitleştirmek için.


2
"JVM için Şemayı basitleştirmek anlamına geliyordu" "tıpkı diğer JVM dilleri gibi" Evet, doğru.
oskarkv

4
Gimp C ile yazılmıştır ve komut dosyası dilleri olarak Scheme, Python ve Perl'i destekler.
lbalazscs
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.