Lisp, diğer programlama dilleri tarafından kabul edilmemiş özel bir özelliğe sahip mi?


35

Lisp, diğer programlama dilleri tarafından kabul edilmemiş özel bir özelliğe sahip mi?

Lisp ile bütün Lisp programlama dillerini bir bütün olarak kastediyorum. Lisp’in ne kadar şaşırtıcı olduğunu ve birçok dilin Lisp’ten ilham aldığını bildiğim söylendi. Ancak Lisp'in başka bir dilde yapılamayan özel bir tasarım özelliği var mı?

Soruyu sormamın nedeni, son zamanlarda amatör bir programcı olduğum için, sadece eğlence için Clojure'u öğrenmeye başladım ve sonuçta Lisp ile ilgili birçok yazı ve yorum buldum; "ama diğer modern programlama dilleri Lisp'ten şartlar, özyineleme ve birinci sınıf vatandaş olarak işlev gibi birçok fikri benimsemiş ve çalmıştır. Ve hatta metaprogramlama birçok dilde yapılabilir.

Bir şeyi kaçırdım mı ve "Lisp hala farklı" mı?

Ya da şanslıyım çünkü diğer modern diller Lisp'teki tüm iyi parçaları çaldılar, böylece Lisp dünyasını parantez içine almak gerekli olmuyordu ve "Lisp farklıydı".


3
Araştırmanızı paylaşmak herkese yardımcı olur. Bize ne denediğinizi ve neden ihtiyaçlarınızı karşılamadığını söyleyin. Bu, kendinize yardım etmek için zaman harcadığınızı, bariz cevapları tekrar etmemizi önlediğini ve hepsinden daha belirgin ve alakalı bir cevap almanıza yardımcı olduğunu gösteriyor. Ayrıca bkz. Nasıl
Sorulur

3
Tavsiye için @gnat Thx, ve ben sorumu güncelledik :)
iceX

10
Bir sorun, bir dil belirli bir Lisp özellikleri alt kümesine sahip olduğunda (örneğin, S ifadeleri ve makrolar), insanlar bunun bir Lisp olduğunu iddia ediyor. Elbette ki bu sonuçlara göre (bu insanlara göre) hiçbir Lisp dili bu özelliklere sahip olamaz.

9
Sanırım yuvarlak parantezlerin her şey için tek gruplama şekli olduğu başka bir dil yok :-)
Doc Brown

Bir aile olarak Lisp son derece benzersiz olmayabilir, ancak birçok lisp lehçesi (Racket, CL, Scheme, Clojure) hala birçok faydalı / benzersiz özellik sunar.
jozefg

Yanıtlar:


28

Bu tür bir soru için kanonik bir referans Paul Graham'ın Lisp'ten Farklı Yaptığı . Lisp’in, yazı sırasında bu makaleye göre, yaygın olarak bulunmayan iki önemli özelliği şunlardır:

8. Sembol ağaçlarını kullanarak kod için bir gösterim .

9. Bütün dil her zaman kullanılabilir. Okuma zamanı, derleme zamanı ve çalışma zamanı arasında gerçek bir ayrım yoktur. Kod okurken derleyebilir veya çalıştırabilir, derlerken kod okuyabilir veya çalıştırabilir ve çalışma zamanında kod okuyabilir veya derleyebilirsiniz.

Yorum her noktayı ele alır ve bu özelliğin mevcut olduğu popüler dilleri adlandırır.

Lisp makrolarını mümkün kılan (9 ile) 8, Lisp için şimdiye kadar benzersizdir, çünkü (a) bu parens veya o kadar kötü bir şey gerektiriyorsa ve (b) eğer bu son güç artışını eklerseniz artık yeni bir dil icat ettiğini iddia edemezsiniz, ancak yalnızca Lisp'in yeni bir lehçesini tasarladınız; -)

Bu makalenin en son 2002 yılında gözden geçirildiğini ve son 11 yılda, bazıları tüm bu Lisp özelliklerini tasarımlarına dahil edebilecek çok çeşitli yeni dillerin bulunduğunu unutmayın.


2
Bu özellikler Lisp'e (ve doğrudan türetilmiş değişkenlere) özgü değildir ve uzun zamandır olmamıştır.
Donal Fellows,

21
@iceX: JavaScript ile Lisp, Smalltalk, Self, Newspeak, APL, Factor, Forth vb. dilleri arasındaki fark, JavaScript'teki programların "ölü" olmasıdır. Onlar metin dosyalarıdır. Çalışan programı öldürürsünüz, metin dosyasını düzenlersiniz, sonra programın tamamen yeni bir kopyasını başlatırsınız. Bu diğer ("canlı" ortamlar) ortamlarında , çalışan programı hiçbir zaman durdurmazsınız, çalışan programın kendisi, çalışırken diğer herhangi bir nesneyi değiştirdiğiniz gibi değiştirdiğiniz bellekteki bir nesne kümesidir . (Not: Bu Clojure için doğru değildir, ancak çoğu yaşlı Lisps bu şekilde yapar.)
Jörg W Mittag

2
@ JörgWMittag Vay ... Yani, Clojure, Clojurescript, lispyscript gibi programlama dilleri aslında "gerçek lisp" değildir, çünkü kodlarını eski lisp Lisp, Common Lisp gibi değiştiremezler. Ama ... eğer değiştiremezlerse ... neden kod manipülasyonu için düşündüğüm S-ifadesini kullanmak için
can atıyorlar

4
@iceX: Pek çok dil var evalveya benzer, ancak çok azı metaprogramlama yapabilir, örneğin Haskell'in Şablon Haskell'i. Lisp ile ilgili (tartışmalı) benzersiz olan şey, verilerin, kodun ve meta kodun temsilinin aynı olması - sadece sözdiziminde değil, aynı şey.
tdammers

2
@iceX Eval, sadece bir kısmı, ama hepsi değil. Lisp'te derleme zamanında kodu çalıştırabilirsiniz. Kodu okuma zamanında çalıştırabilirsiniz. Evet clojure, Lisp'in tüm dinamizmini destekliyor, makrolara, okuyucu makrolarına ve değerlendirmelere ve çalışan bir programa bir REPL ekleme yeteneğine sahip.
stonemetal,

15

Soru, cevap vermek zor bir sorudur, çünkü birileri Lisp'te başka hiçbir özelliğin bulunmadığını bilmek için tüm dilleri bilmek zorundadır, bu nedenle aşağıdakiler deneyimlerime dayanan dilleri temel almaktadır.

Başımın üstünde, koşullar başka bir dilde görmediğim bir şey. 'İstisnaları' düşünün, ancak çağrı yığınının çözülmediği ve arayan kişinin istisna sitesine bir kurtarma değeri gönderebileceği, ancak çağrı yığınını işleyici ve istisna kaynağı arasında rahatsız etmeden nereye gönderebileceği . Adil olmak gerekirse, bu gerçekten sürekliliğin özel bir uygulamasıdır, bu yüzden Ruby ve Scheme (en azından) bunu yapabilir.

Lisp'in makro sistemi düzenlilik / homoikoniklikten yararlanır, ancak Scala bunları 2.12'de kararlı bir özellik olarak kullanmayı planlıyor ve Template Haskell de benzer özelliklere sahip olduğunu iddia ediyor. Lisp'ten daha sözdizimsel olarak daha karmaşık olacaklarını iddia ediyorum, ancak derleme zamanı kodu ne olursa olsun orada.

Yine de düşününce, düz form oluşturma Lisp'te yalnızca bir tür makro var: Başka hiçbir yerde bir derleyici veya okuyucu makro eşdeğerini görmedim.

Bazı lehçelerin (örn. SBCL ) tam ve devam ettirilebilir bir işlem görüntüsünü kaydetme kabiliyeti iyidir, ancak yine de benzersiz değildir: Smalltalk on yıllardır bunu yapıyor.

Diğer birçok dil, dizileri döndürürken tahrip etme atamasına izin verir, ancak # 'değerleri ve #' çoklu-değer bağlama / let-değerleri yaklaşımı hala Common Lisp ve Scheme'e (hala 'normal' yıkımı da yapabilir) özgüdür ). Perl'in 'wantarray' işlevi skaler, liste veya boşluk bağlamında çağrılıp çağrılmayacağını belirleme işlevine izin verir, böylece dönüş değerini benzer (-ish) şekilde ayarlayabilir, ancak dışında 'true' çoklu dönüş değerleri görmedim Şeması / CL.

Dil özellikleri açısından, Lisp'in diğer dillerin yapamayacağı şekilde yapabileceği pek bir şey yoktur (Tam olarak öyledir). Ne olduğunu , ancak, kod kendi veri yapıları cinsinden ifade edilen bir dil, kod -yani Big Idea ™ yapma çalışmalarına nispeten kolaydır veri birşeydir.


3
Scala makroları Lisp makrolarından, TH makrolarından, Scheme hijyenik makrolarından vb. Çok daha az güçlüdür. MetaLua ve Converge'de eşit derecede güçlü bir sistem bulunabilir.
SK-mantık

4

On yıllardan sonra, Lisp'e özel bir şey olduğunu sanmıyorum. Fakat bugün bile, Lisps dışında bulunması zor olan birçok ilginç şey var. Akla gelen birkaç şey:

  • Gelişmiş meta-protokollere (CLOS) sahip yüksek kaliteli bir nesne sistemi uzaktan popüler değildir.
  • zaman zaman bir yerlerde çoklu yöntemler ortaya çıkıyor, fakat çoğu insan onlardan hiç haber almadı.
  • Diğerlerinin de belirttiği gibi, koşul sistemi popüler istisna işleme mekanizmalarına kıyasla oldukça karmaşıktır.
  • Dilin semantiğinin kompakt bir sunumu (eval), kişinin dilini tanımlamak ve onu derinlemesine derin adaptasyonlar için kullanılabilir kılmak için güçlü bir yaklaşım (bkz. SICP ) - mevcut popüler dillerin "eval" işlevleri aynı özellikleri paylaşmıyor.

Son olarak, Lisp'ten öğrenilecek, dilin kendisi ile ilgili olmayan ancak Lisp tarihinin bir parçası olan ve zaman içinde kaybedilen çok şey var. Örneğin, Interlisp, Symbolics Genera, vb ... Ellerinizi Genera'ya hiç koymazsanız, Kent Pitman'ın "Emacs'in sadece Genera'nın Zmac'larının soluk gölgesi olduğunu" tarif ettiği bu comp.lang.lisp dizisine bakın . Zmac’ların bir parçası olduğu, bir Lisp makinesinde çalışan güçlü bir Lisp sistemine sahip.


Hemen hemen her modern zorunlu dilde standart bir özellik olan ve aşırı yüklenme yöntemlerinden ayırt eden iyi bir multimetrenin açıklamasını hiç görmedim , ancak multimetod gönderiminin çalışma zamanında dinamik olarak çözülmesi ve bu nedenle aşırı yüklenmiş yöntemleri kullanmaktan çok daha yavaş olması dışında derleme zamanında çözümlenir.
Mason Wheeler

Önemli ayrımları var. Bu konuda kaynak bulmakta sorun yaşıyorsanız, burada her zaman yeni bir soru oluşturabilirsiniz ..
Thiago Silva

Julia'nın çoklu metotları var ve Haskell'in parametrik polimorfizmi bir tür multimetod gibidir. Birçok dilde çoklu metotları simüle etmenin yolları vardır. Koşul sistemi özellikle gerçekten istediğim bir şey (C # debugger'lar için görsem de düzenleyip devam et).
aoeu256

4

Bu kesin olarak kesin bir tek özellik değil . Tüm görünüm ve his ve belirli özellik kümelerinin birlikte nasıl çalıştığı.

JavaScript veya Java, Lisp'in birçok özelliğine sahiptir (sanal makine, derleyici / değerlendirici, çöp toplama vb.). Fakat örneğin JavaScript, sembolik programlama kısmından yoksundur, matematik yeteneklerinden yoksundur (dahili olarak sadece yüzerdir), hata işlemesi vb. Yoktur.

Pek çok Common Lisp sistemi, yazılımın uzun süre yeniden başlatılmadan çeşitli meta programlama teknikleri kullanılarak Lisp dilinin çeşitli boyutlarda genişletilmesiyle birinin yeni bir yazılımı artırdığı bir geliştirme yolu için optimize edilmiştir. Bu nedenle esnek ve genişletilebilir olması gerekir - ama aynı zamanda sağlam olması gerekir. Dili değiştirmek (makrolar temelde kullanıcının derleyiciyi genişletmesi için bir yoldur) programı çökertmeden.

Artık JavaScript gibi bir şey de bir programı, genellikle bir web tarayıcısını genişletmek için kullanılıyor. Fakat çoğu zaman JavaScript'te meta programlama çok fazla değildir - bazı OOP hackery'lerinin yanı sıra .

Örnek:

Bir kişi bilgisayar cebirinin alanı için genel olarak gelişmiş bir matematik yazılımını çoğunlukla iki şekilde uygulayabilir: motoru C ( ya da Mathematica gibi ) veya daha ileri bir Lisp lehçesinde özel bir dille yazınız . Macsyma / Maxima Common Lisp, azaltın Standart Lisp içinde Axiom Common Lisp.

(Python'da bir veya daha fazla yazılı da vardır.)

Common Lisp'in üzerinde çalışan Axiom gibi bir özellik seti sunan pek çok sistem yoktur .

Lisp'i bu tür uygulamalar için cazip kılan özelliklerin bir karışımı: ileri düzey temel matematik (bignums, oranlar, ...), sembolik hesaplama, etkileşimli derleyici, vb. seviye dili Bu şekilde, bir kişi tipik bir Lisp sisteminin% 50 veya daha fazlasını uygulamış olacak.


2

Bildiğim kadarıyla değil. Forth'daki Lisk kadar dinamiktir, belki Forth'daki dinamik kod normal Forth koduna benziyor çünkü Lisp makroları normal Lisp kodundan farklı özellikler kullanma eğilimindeyken ( Clojure'de en azından bir makro dışında sözdizimi alıntı kullanmadım) ve Sonuç olarak normal Lisp kodundan gerçekten farklı görünüyorlar. Forth'un ne kadar dinamik olduğuna bir örnek olarak, Forth'taki yorumları uygulamanın bir yolu :

: (   41 word drop ; immediate
( That was the definition for the comment word. )
( Now we can add comments to what we are doing! )

1
Forth göründüğü kadar eğlenceli, her zaman ümitsizce mat ve garip buldum, belki de yığın temelli ve her şey tersine çevrilmiş.
Robert Harvey,

2
Meraktan derken, "dilin ana bölümünden ayrılmış" ile ne demek istiyorsunuz? Lisp'teki makrolar, makronun tanımlandığı noktada tanımlanan tüm fonksiyonlara tam erişime sahiptir, bunlardan herhangi biri, makronun genişlediği formu oluşturmak için kullanılabilir. Bu, bir veritabanından ve / veya sunucudan alınan bilgiyi içerebilir. Yorum örneğiniz, şöyle tanımlanabilir: (defmacro yorumu (ve geri kalan vücut)), öyle değil mi?
Danny Woods

1
@DannyWoods Makrolar normal kod gibi görünmüyor demek istiyorum. En azından klojürde normal koddan makro kodunu anlayabilirsiniz çünkü normal kodda olağandışı olan sözdizimi fiyat teklifi, alıntı ekleme vb. Verdiğim kod örneği, ani görene kadar normal kod gibi görünüyor. Cevabımı tekrar okudum, sadece kötü ifade edildi.
stonemetal

1
@stonemetal Endişeye gerek yok, ancak Common Lisp veya Clojure'da sözdizimi alıntılarında makroya özgü hiçbir şeyin olmadığını belirtmekte fayda var. Düzenli işlev tanımlarında backtick ifadelerine sahip olmak bazen uygundur ve makro gövdeler düz listelerle manuel olarak oluşturulabilir (ancak sözdizimi teklifinin iyi bir şey olduğuna karar vermek için bunu yalnızca bir veya iki kez yapmanız gerekir!)
Danny

1
Adil olmak gerekirse, aynısı özel bir okuyucu makrosu kaydederek Lisp'te yapılabilir.
fjarri

2

Lisp birçok lehçeye sahiptir ve her birinin kendine özgü özellikleri vardır. Başka bir dil tarafından benimsenmesi muhtemel olmayan en sevdiğim özellik, Interlisp'in "spagetti yığını" .

Spagetti yığını bir kapanış gibidir, ancak steroidler üzerinde. Yalnızca geçerli işlevi değil, yığının en üstündeki tüm içeriği de kaydeder. Bunları keyfi bir şekilde oluşturabilmeniz dışında, yığın bağlamında bir hiyerarşi ile sonuçlanacak dışında, bir rutin gibi bir şey .


Bunu bilmiyordum, kontrol edeceğim, cevabınız için teşekkürler :)
iceX

7
Bu, Scheme'nin sürekliliği ile aynı mıdır?
Nicola Musatti

1
Bir "spagetti yığını" olan @NicolaMusatti, Şema benzeri süreklilikler için ortak bir uygulama stratejisidir (bunları yaratan fonksiyonun geri dönmesinden sonra çağırılabilir).
Alex D
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.