Lisp'in hangi lehçesini öğrenmeliyim? [kapalı]


91

Lisp'in birkaç farklı lehçesi olduğunu biliyorum. Lisp öğrenmenin yeni bir entelektüel deneyim olacağına karar verdikten sonra, hangi Lisp lehçesini ve neden öğreneceğimi bilmek istiyorum.

Diğerlerinden daha popüler olan var mı? Bunlardan herhangi biri daha "eksiksiz", olduğu gibi, daha iyi belgelenmiş ve desteklenmiş mi? Bu lehçenin artıları ve eksileri nelerdir?



Bunu sormadan önce bununla ilgili bir araştırma yaptım ama sorunun doğası ben yazarken gelişti. Tekerleği yeniden icat etmemeyi sağlayacağım.
Humphrey Bogart

Peki bu soruyla Greg'in yukarıda bahsettiği soru arasındaki fark nedir?
cjs

2
Sanırım söylemeye çalıştığı şey şuydu: Sorumu aklımda ilk formüle ettiğimde mevcut sorudan tamamen farklıydı ve ilgili aramadaki sorulara bakmak istediğine uyan hiçbir şeyi ortaya çıkarmadı. Sor. Ancak soruyu yazdığında, soru değişti ve böylece daha önce sorulan mevcut haliyle SO'ya ulaştı.
J. Polfer

Yanıtlar:


77

Basitlik ve temizlik arasında bir denge, çekici özellikler ve ilginç ve faydalı yazılımlar (kendinize) yazmanıza ve ayrıca bir öğrenme aracı olarak hizmet etmenize olanak tanıyan bir platform aramak istiyorsunuz. (Bu sonuncu, daha uzun süre devam etmenizi ve öğrenmenizi sağlayacaktır.) İşte bazı olasılıklar:

  1. Şema. Muhtemelen tüm lehçelerin en temizidir. The Little Schemer'ın LISP'den Scheme'ye neden çevrildiğine şüphe yok . Beşinci Şema standart özelliği, R5RS , kendi başına harika bir eğitimdir; şimdiye kadar okuduğum en güzel dil ve kütüphane spesifikasyonu ve aynı zamanda makul ölçüde kapsamlı olan en kısası olabilir. PLT Scheme (şimdi Raket) platformu, oldukça iyi tercüman ve derleyici içerir komut dosyası için iyidir ve ayrıca öğrenme için mükemmel kılan bazı görsel araçlara sahiptir.

  2. Common Lisp. Muhtemelen en taşınabilir ve kapsamlı değişken, ticari yazılım gibi şeyler yazmak istiyorsanız, büyük olasılıkla istediğiniz şey budur. Standart, kapsamlı kitaplıkları tanımlar ve bunun ötesinde çok daha fazlası mevcuttur, CLOS'a sahiptir , bu muhtemelen size OO hakkında herhangi bir OO dilinden daha fazlasını öğretecektir ve bazı derleyiciler çok iyidir. Dezavantajları, Scheme'nin sahip olmadığı bazı siğillerdir (işlevlere atıfta bulunan değişkenler için ayrı bir ad alanına sahip olmak gibi), temiz ve basit olmamak (uzantılara sahip olması ve ödünleri gerekli kılması gereken her şeyde olduğu gibi) gerçek dünyadaki büyük uygulamalar için), hijyenik makrolara sahip olmamak ve tekrarlamayı Scheme'den çok daha az vurgulamak.

  3. Clojure.Bu, JVM üzerinde çalışır ve Java geliştiricileri için bir avantaj sağlayabilir. Birkaç siğil var (örneğin, kuyruk arama optimizasyonunu açıkça istemelisiniz, ancak bu, JVM'ye TCO eklenirse bir gün değişebilir). Makrolar, hijyenik olmamakla birlikte, değişken yakalamadan kaçınmanıza yardımcı olacak bazı özelliklere sahiptir, böylece CL'de olduğundan daha az kazara yapma riski ile birlikte, gerçekten isterseniz değişkenleri yakalayabilirsiniz. Tüm Java kitaplıklarına kolayca erişebilirsiniz; bu muhtemelen "gerçek dünya" kodu için iyi bir şey ve öğrenme açısından oldukça anlamsız. Kalıcı veri yapıları için bir dizi kitaplık ve STM desteği var, bu da onu eşzamanlı bir bakış açısından çok ilginç kılıyor; bu muhtemelen en iyi bahsinizdir. eşzamanlı ve paralel programlamayla ilgili yeni yöntemler hakkında daha fazla bilgi edinmekle ilgilenir. Görünüşe göre Clojure, Java gibi büyük üretim uygulamaları için kullanılabilir, yani üretim uygulamalarında yapmak istemediğiniz ve yapmadığınız "çirkin şeyleri" yapma yeteneğine sahip olacak. öğrenirken.

  4. Emacs Lisp. LISP açısından bu, oradaki en iyi örneklerden biri değil. En büyük hatalarından biri dinamik kapsam belirlemedir, ancak başka birçok hata da vardır. Ancak, bir Emacs kullanıcısıysanız, bu, editör kullanımınızı geliştirmek için öğrenebileceğiniz en güçlü araç olabilir. Emacs Lisp'i öğrenerek ne kadar öğreneceğiniz, Emacs'ı nasıl genişleteceğin ötesinde, benim için açık bir sorudur ancak; Emacs Lisp'te yüksek dereceli fonksiyonlar gibi ilginç tekniklerin ne sıklıkla kullanıldığını bilmiyorum.

2018 Güncellemesi

Bu yazıyı yazdığımdan bu yana neredeyse on yıl geçti ve Lisp dil ​​ailesi artık genel programcı bilincinde önemli bir ilgi görüyor gibi görünüyor. Bunun çoğu, kendi başına Lisp'in tamamen ayrı bir lehçesi haline gelmekle kalmayıp, kendi iyi fikirlerinin çoğunu tanıtmakla kalmayıp, aynı zamanda şimdi JavaScript'i hedefleyen neredeyse aynı bir versiyona sahip olan ve diğer birçok Lisp'e ilham veren Clojure ile ilgili gibi görünüyor. diğer platformları hedeflemek. Örneğin, Hy , önce Python ile birlikte çalışabilirliği hedefleyen, ancak "şüpheye düştüğünde" Clojure fikirlerini kullanarak CPython AST ve bayt kodunu hedefler. (En son kayıtlara göre ikincisi biraz değişiyor olabilir.)

Bunun karar verme sürecinizde getirdiği büyük değişiklik, Lisps veya Lisp benzeri diller için mevcut olan her şeye de bakmanız ve Perl , Ruby , Erlang , Go veya hatta kullanmakta olduğunuz diller veya platformlarla birlikte çalışmanız gerektiğidir. Mikrodenetleyicilerde C ++ .


3
Ayrı ad alanlarına sahip olmak bir siğil değildir, sadece farklı bir tasarım kararıdır. Scheme'de zaten birkaç başka ad alanı olduğunu unutmayın, bu nedenle tartışma Lisp-5'e karşı Lisp-6'dır. CL'de bir liste "liste" ve bir araba "araba" diyebilmemin rahatlığının yanı sıra, makro sistemi çok daha pratik ve kullanışlıdır çünkü derleyici işleri o kadar kolay karıştırmaz.
Svante

Clojure'un kuyruk çağrısı optimizasyonu yoktur ve olamaz çünkü JVM bayt kodu onu desteklememektedir. Sahip olduğu tek şey, mevcut işlevi kendi kendine yineleyen "yinelenen" özel bir biçimdir.
Svante

3
Curt: Clojure'un Java VM üzerinde çalıştığı için en taşınabilir olduğunu iddia ediyorum.
justinhj

1
Bunu bilmiyorum; Yine de değiştirilmemiş bir masaüstü / sunucu programı çalıştırmayacağınız küçük ve gömülü cihazları (telefonlar ve akıllı kartlar gibi) hariç tutarsanız, elisp kesinlikle JVM'den çok daha fazla CPU ve platformda çalışır.
cjs

1
Kesinlikle katılmıyorum. Özyineleme, a) daha saf, b) doğrulanması daha kolay, c) daha doğru olma olasılığı daha yüksek bir kod üretme eğilimindedir. Daha ayrıntılı olarak: a) işlevin dışındaki daha az değişkene dokunma eğilimindedir; b) bir endüktif ispat, özyinelemeli fonksiyondan doğal olarak çıkma eğilimindeyken, döngülerde döngü değişmezlerini, vb. kontrol etmeniz gerekir; c) güvenilirlik a) 'dan gelir ve doğal olarak (belki de gayri resmi olarak) b)' nin tümevarımlı ispatını yapmanızı sağlayacak şekilde kodlamaya itilirsiniz.
cjs

22

Şimdiye kadar okumaya çalıştığım en akıl almaz eğlenceli ama son derece zor kitaplardan biri olan Little Schemer yüzünden Scheme diyebilirim .


15
SICP'yi unutma! mitpress.mit.edu/sicp . Bu klasik bir okuma.
Joris Timmermans

7
The Little Schemer'ın çevirisi olarak çıkmadan önce The Little Lisper'in iki veya üç baskısı vardı .
cjs


8

Ayrıca Clojure, bugünlerde çok fazla zihin paylaşımı kazanıyor ve bunun iyi bir nedeni var. Harika veri yapıları, son derece iyi eşzamanlılık desteği (Scheme ve CL'yi bu konuda utandırıyor) ve harika bir topluluk. Aynı zamanda nispeten basittir, CL en az C ++ kadar karmaşıktır.

Bu CL veya Scheme'den hoşlanmadığım anlamına gelmez. SICP ile Scheme öğrendim. Ve CL beni Clojure'a getirdi. Sanırım her şey hedeflerinize bağlı. Son derece pratik bir Lisp öğrenmek istiyorsanız Clojure'a gidin. Aksi takdirde CL veya Scheme harika.


Bu, ne CL ne de Planın "son derece pratik" olmadıkları anlamına gelir, ancak aslında oldukça pratikler. Özellikle CL standardı, pratik düşüncelerden doğmuştur .
Leslie P. Polzer

2
Programlama dili ortamı 1994'ten beri değişti, CL standardının o zamandan beri öğrenilenlere uyum sağlamak için nasıl değişeceğini / gelişeceğini bilmiyorum. Dünya ileriye doğru sallanıyor ve anlayabildiğim kadarıyla CL hareketsiz duruyor. CL'den hoşlanıyorum, Clojure'un gücüne yaklaşmanın bir yolu var, ancak CL'nin nasıl gelişeceğini bilmiyorum - eğer standartlaştırılmış bir dil kullanacaksanız, evrimsel bir yol görünür olmalıdır. O olmadan, dil büyük olasılıkla pratik bir seçim değildir .
dnolen

4
CL gelişti ve birçok yararlı kitaplık aracılığıyla gelişiyor. Temel dil, 1994 yılında bugünün tüm "modern" dillerinden daha güçlüydü.
Svante

5

Nesne yönelimli programlamayı sevdiğim için CL'i tercih ederim ve CLOS etraftaki en güzel nesne sistemi.


5
CL'den bahsetmişken, ClozureCL veya SBCL'yi tavsiye ederim. Her ikisi de açık kaynak kodlu, iyi belgelenmiş, olgunlaşmış, çok platformludur ve çok iş parçacıklı okuma gibi önemli standart dışı işlevler sağlar.
Daniel Dickison

5

Okulda Scheme öğrendim . Harika bir öğrenme deneyimiydi ve fonksiyonel programlamanın temellerini asla unutmayacağım. Kullanışlılığının özünü anladığınız sürece, LISP'nin hangi sürümünü aldığınız önemli değildir - durumsuz lambda hesabı.

İşte MIT'nin giriş programlama dersinde neden Scheme'den Python'a geçtiğine dair ilginç bir makale .


3

En azından ilk başta hepsini söyleyebilirim. Sonunda muhtemelen Scheme veya Common Lisp için bir tercih geliştireceksiniz, ancak ikisi de orada olan her şeyi halletmenin en iyisi olduğu konusunda yeterince farklılığa sahip.

Scheme, örneğin devamlara sahiptir ve Common Lisp'te uygulanabilseler bile, Scheme'de olanlar hakkında bilgi edinmek iyidir.

Sözcüksel ve dinamik kapsam arasındaki farkı öğrenmek önemlidir ve hem Common Lisp'i hem de elisp'i öğrenirseniz, ikisinin de sonuçlarına rastlarsınız.


0

LFE (Lisp Aromalı Erlang) iyi olurdu. Lisp sözdizimine Erlang VM'nin üstünde sahip olabilirsiniz.


0

Başlamak için bir tür "yüklü" soruydu ama OP muhtemelen bunu bilmiyordu. Genel olarak, Common ve Scheme lispers, PC ve Apple bilgisayar "insanları" gibidir, karıştırmazlar. Hangisinin en iyisi olduğu, muhtemelen hangisinin sizin için "işe yaradığı" kadar alakalı değildir. Gerçekten, o kadar çok fark yok. Muhtemelen birini diğerine tercih etmek, hangisini ilk öğrendiğinizden etkilenebilir. (Bana göre boş bir liste "hiçbir şey" olmamalı, CL'de NIL olarak bilinir ve bu beni bir Common Lisper yapar.) SBCL'nin EMACS kullanarak Slime ile entegrasyonunu seviyorum, ancak SBCL herkes için değil. Birincisi, SBCL çok katıdır. Yalnızca "eğlenmek" istiyorsanız, GNU clisp'i kolaydır ve hemen hemen her platform için kullanılabilir.

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.