Clojure - diğer Lisp'ler [kapalı]


95

Sorumun amacı bir ateş savaşı başlatmak değil , daha çok her dilin hangi koşullarda "iş için en iyi araç" olduğunu belirlemektir.

Clojure ( Programming Clojure , Practical Clojure , The Joy of Clojure ve Clojure in Action'ın Manning Erken Erişim baskısı ) üzerine birkaç kitap okudum ve bence bu harika bir dil. Şu anda çoğunlukla Common Lisp makrolarıyla ilgilenen Let Over Lambda'yı okuyorum ve o da çok ilginç bir dil.

Ben değil genel olarak, fonksiyonel programlama yapar (diğer bir newbie) bir Lisp uzmanı, ancak dillerin bu aile beni büyülüyor.

Clojure'ün avantajları (ve "diğerlerinin" dezavantajları):

  • JVM'de çalışır.

    • JVM, Sun'ın "Bir kez yazın, [neredeyse] her yerde çalıştırın" hayalini oldukça iyi karşılayan çok kararlı, yüksek performanslı bir dil ortamıdır. Macbook Pro'mda kod yazabilir, onu çalıştırılabilir bir JAR dosyasında derleyebilir ve ardından Linux ve Microsoft Windows üzerinde çok az ek testle çalıştırabilirim.

    • (Hotspot ve diğer) JVM, yüksek kaliteli çöp toplamayı ve çok performanslı tam zamanında derlemeyi ve optimizasyonu destekler. Sadece birkaç yıl önce, hızlı çalışması gereken her şeyi C dilinde yazdım, şimdi bunu Java'da yapmaktan çekinmiyorum.

    • Standart, basit, çok iş parçacıklı model. Common Lisp'in standart bir çoklu okuma paketi var mı?

    • Tüm bu parantez monotonluğu kadar Sonları [], {}ve #{}Common Lisp uzmanları muhtemelen okuyucu makrolarıyla, sen CL ekleyebilirsiniz söyle rağmen.

Clojure'un dezavantajları :

  • JVM'de çalışır.
    • Kuyruk özyinelemesi veya devam ettirme yok. Common Lisp sürekliliği destekler mi? Planın her ikisi için de destek gerektirdiğine inanıyorum.

Başkalarının Avantajları (özellikle Common Lisp) (ve Clojure'un dezavantajları):

  • Kullanıcı tanımlı okuyucu makroları.

  • Diğer avantajlar?

Düşünceler? Diğer farklılıklar?


15
şahsen ben parantez bir tür gibi;) "temizleyici" kodu gibi görünüyor
Moe

3
Avantajlar listenizde okuduklarıma göre Erlang'ı da beğenebileceğinizi anladım www.erlang.org
Peer Stritzinger

4
Clojure, "recur" özel formu aracılığıyla açık kuyruk özyinelemesini desteklemez. Bu, açıkça istemeniz koşuluyla kuyruk özyinelemenin tüm avantajlarından yararlanmanızı sağlar (tek istisna, şu anda birden çok işlev arasında karşılıklı kuyruk özyinelemelerini desteklememesidir).
mikera

1
Clojure, en azından "devam etme stili" anlamında, sürekliliği de destekler. Birinci sınıf devamlara sahip olmadığı konusunda haklısınız. bakın stackoverflow.com/questions/1173133/continuation-in-clojure
mikera

@mikera: Bir işlevde kuyruk özyineleme. Birbirini çağıran iki işlev "tramplen" ile yapılmalıdır, ki bu biraz karışıktır (ama kendi tarzında zarif :-)).
Ralph

Yanıtlar:


52

Clojure'u diğer Lisp'lere tercih etme nedenlerim kişisel listem (ps hala tüm Lisp'lerin harika olduğunu düşünüyorum!):

  • JVM'de çalışır - bu nedenle JVM'nin kendisindeki fantastik mühendisliğe otomatik erişim sağlar (gelişmiş çöp toplama algoritmaları, HotSpot JIT optimizasyonu vb.)

  • Çok iyi Java birlikte çalışabilirliği - Java / JVM dil ekosistemindeki çok çeşitli kitaplıklarla uyumluluk sağlar. Clojure'u farklı Java kitaplıklarını iyi bir etkiyle birbirine bağlamak için bir "yapıştırıcı" dili olarak kullandım. Ayrıca çok sayıda Java kodu geliştirdiğim için, Clojure'ün Java araçlarıyla iyi entegre olması benim için yararlıdır (örn. Clojure geliştirmem için Maven, Eclipse ve Saat Yönünün Tersi eklentisini kullanıyorum)

  • Vektörler [1 2 3], haritalar {:bob 10, :jane 15}ve kümeler için güzel sözdizimi #{"a" "b" "c"}- Modern programlama için bu oldukça önemli araçları düşünüyorum (elbette listelere ek olarak!)

  • Ben şahsen, formları bağlamak için köşeli parantezlerin kullanılmasını seviyorum: örn. (defn foo [a b] (+ a b))- Kodun okunması biraz daha net olduğunu düşünüyorum.

  • Kalıcı, değişmez veri yapıları ile tembel, işlevsel programlamaya vurgu - özellikle tüm çekirdek Clojure kitaplığı bunu varsayılan olarak desteklemek için tasarlanmıştır

  • Çok çekirdekli eşzamanlılık için mükemmel STM uygulaması. Clojure'un şu anda herhangi bir dilin en iyi eşzamanlılık hikayesine sahip olduğuna inanıyorum ( Rich Hickey'in kendisi tarafından daha fazla ayrıntı için bu videoya bakın )

  • Kişisel olarak tercih ettiğim bir Lisp-1 (Scheme gibi) (İşlevsel bir dilde işlevleri ve verileri aynı ad alanında tutmanın mantıklı olduğunu düşünüyorum)


2
STM için +1. Kendi başına Clojure'u kullanmayı haklı çıkarmak için yeterlidir.
André Caron

2
Yine de CL-STM kitaplığını kullanarak STM alabilirsiniz.
Mike Manilone

2
@ AndréCaron sadece ihtiyacınız varsa.
rightfold

Basit bir web uygulaması yazmak ve onu, diyelim ki, aylık 5 $ 'lık ucuz bir sunucuda barındırmak istiyorsanız, bu açıkça JVM nedeniyle Clojure ile mümkün değildir, değil mi?
Hexatonic

@Hexatonic Çok tecrübeli değilim ama bugünlerde kullanılan bir makinenin JVM'si olmayacağına inanmak zor.
MasterMastic

25

Clojure'un bir dil ve bir uygulama (genellikle JVM'de) olduğunu unutmayın. Common Lisp, ondan fazla farklı uygulamaya sahip bir dildir. Yani burada bir kategori uyuşmazlığımız var. Örneğin Clojure'u SBCL ile karşılaştırabilirsiniz.

Genel olarak:

  • Common Lisp'in bir sürümü JVM'de çalışır: ABCL

  • diğer Common Lisp uygulamalarının çoğu

  • Çoğu CL uygulamasının çoklu görev yetenekleri vardır, bir kitaplık ortak bir arayüz sağlar

  • Common Lisp, diziler için sözdizimine sahiptir. Diğer veri türleri için sözdizimi kullanıcı tarafından yazılabilir ve çeşitli kitaplıklar tarafından sağlanır.

  • Common Lisp ne kuyruk arama optimizasyonunu ne de devam ettirmeyi desteklemez. Uygulamalar TCO sağlar ve kitaplıklar bir çeşit devamlılık sağlar.


24

Clojure ve Common Lisp arasındaki önemli bir fark, Clojure'un işlevsel programlama konusunda daha kuralcı olmasıdır. Clojure'un felsefesi, deyimleri ve bir dereceye kadar dil / kütüphaneler, işlevsel bir şekilde programlamanızı kuvvetle teşvik eder ve bazen ısrar eder (yan etki yok, değişken durum yok).

Common Lisp kesinlikle işlevsel programlamayı destekler, ancak aynı zamanda değiştirilebilir duruma ve zorunlu programlamaya da izin verir.

Elbette, eşzamanlılık alanında ve diğer alanlarda işlevsel programlamanın bir dizi faydası vardır. Ancak diğer her şey eşit olduğunda, her durum için hangi yaklaşımı kullanmak istediğinizi seçmeniz de iyidir. Clojure zorunlu programlamayı tamamen yasaklamaz, ancak bu stile Common Lisp'ten daha az uyum sağlar.


3
@Charlie Flowers: Common Lisp'te "tamamen işlevsel" bir tarzda (kalıcı veri yapısı desteği, vb.) Programlamanın mümkün olduğuna inanıyorum, ancak disiplin gerektiriyor. Doğru?
Ralph

2
Sadece "yan etki yok, değişken durum yok" üzerine bir açıklama - Clojure değişken bir duruma sahiptir (referanslar, atomlar, ajanlar vb. Tümü değiştirilebilir) ancak buna kontrollü bir şekilde erişmenizi gerektirir (yani STM mekanizmaları ve ilgili işlem yoluyla semantiğini güncelle)
mikera

5
@mikera: Clojure'un kullanılabilir olması için Java kitaplıklarının kullanımına güvenmesi ve tüm bu kitaplıkların zorunlu stil gerektirmesi ve yan etkilerle dolu olması dışında. Java ile bağları zehirli bir hediye olarak buldum ...
André Caron

1
@Andre - tabii, değişken durum ve zorunlu anlambilim gerektiren bir kitaplık kullanmaya karar verirseniz, bunu yönetmeniz gerekir. Bu, başka bir dilden böyle bir kitaplığa erişmiş olmanızdan farklı değildir. Ancak iki iyi seçeneğiniz var: a) Bu tür kitaplıkları kullanmayın - tamamen Clojure ile mükemmel derecede iyi kodlar yazabilirsiniz veya b) bu ​​kitaplıklarla arabirim oluşturmanın karmaşıklığını, genellikle kolay olan Clojure tarzı işlevsel bir arabirime sarabilirsiniz. makrolar veya aracılar vb. Genel olarak, Java kitaplıklarından yararlanma yeteneğinin, problemden çok daha büyük bir faydası olduğunu gördüm.
mikera

4
@mikera: kütüphanelerin bir faydası var. Java kitaplıklarını kullanmanın (bu, Rich Hickey'in dil için birincil hedeflerinden biridir), Clojure'un "diğer lisplerden daha işlevsel" yönüne gerçekten aykırı olduğunu belirtiyorum. Yorumum şu anlama geliyordu: "Bu kitaplıkları yeniden yazmazsanız / paketlemediğiniz sürece, zorunlu görünen kod elde edersiniz ve Clojure'un daha güzel bölümlerinden yararlanamazsınız".
André Caron

10

İşte Scheme (çoğunlukla Racket) ve Clojure'un bir karşılaştırmasını içeren iyi bir video .

Adil olmak gerekirse, Racket veri türleri için de sözdizimi şekeri (ek okuyucular) içerir (# has, #, köşeli parantezler vb.)

Artı, Clojure'un düzgün bir kuyruk çağrısı yapmanın tek yolu kullanmaktır recur, JVM'ye derlemenin dezavantajı budur.

Not recurClojure olmayan tek yığın alıcı loop yapıdır. Kuyruk arama optimizasyonu yoktur ve bilinmeyen sınırların döngüsü için kendi kendine çağrıların kullanılması önerilmez. recurişlevseldir ve kuyruk konumunda kullanımı derleyici tarafından doğrulanır. ( Özel Formlar ).


Bağlantı öldü sanırım.
nawfal

1
@nawfal Sanırım düzelttim
Daniil

6
Bağlantı öldü (tekrar?)
Hesabı Atın

1
Görünüşe göre bu bağlantıdaki video şurada bulunabilir: vimeo.com/22675078 .
GDP2

trampolineKuyruk aramaları için de var .
HappyFace
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.