Scheme vs Common Lisp: Projenizde hangi özellikler fark yarattı? [kapalı]


155

Hem StackOverflow hem de bu sitede belli belirsiz "Scheme vs Common Lisp" soru sıkıntısı yoktur, bu yüzden bunu daha odaklı hale getirmek istiyorum. Soru, her iki dilde kodlamış olan insanlar içindir:

Scheme'de kod yazarken, Common Lisp kodlama deneyiminizin en çok hangi unsurlarını özlediniz? Ya da, tersine, Common Lisp’i kodlarken, Scheme’de kodlamayı ne kaçırdınız?

Ben sadece dil özellikleri demek istemiyorum. Aşağıdakiler, soru ile ilgili olarak, kaçırılması gereken geçerli şeylerdir:

  • Özel kütüphaneler
  • SLIME, DrRacket vb. Gibi geliştirme ortamlarının özellikleri
  • Gambit'in C kod bloklarını doğrudan Şema kaynağınıza yazma yeteneği gibi belirli uygulamaların özellikleri.
  • Ve elbette, dil özellikleri.

Umduğum cevap türlerine örnekler:

  • “X'i Common Lisp'te uygulamaya çalışıyordum ve Scheme'nin birinci sınıf sürekliliğini sürdürürsem, tam olarak Y'yi yapardım, ama bunun yerine daha çok acı verici olan Z'yi yapmak zorunda kaldım.”
  • “Scheme projemde derleme sürecini yazmak kaynak ağacım büyüdükçe ve giderek daha fazla C kütüphanesinde bağlantı kurduğumda giderek acı veriyor. Bir sonraki projem için Common Lisp'e geri döndüm.”
  • "Çok büyük bir C ++ kod tabanına sahibim ve benim için C ++ çağrılarını doğrudan Gambit Scheme koduma gömebilmem, Scheme'nin SWIG desteği olmasa bile Common Lisp'e karşı yapabileceği tüm eksikliklere tamamen değdi."

Bu yüzden, "Şema daha basit bir dildir" gibi genel düşünceler yerine, savaş hikayeleri umuyorum.


25
Mükemmel, iyi ifade edilmiş bir soru. Bunu kendim merak ediyorum; umarım dışarıda biraz bilgi vermek isteyen her iki dilde de uzmanlığı olan bazı insanlar vardır.
Robert Harvey,

1
@Josh K - açıkça cevap verilebilir, ancak mutlaka kesin bir cevap yoktur. Bahse girerim ki bir tane olacak çünkü birileri çıkacak, o kadar müthiş bir cevapla çıkacak, herkes o kadar harika ki!
glenatron

4
@Josh: O zaman belki Scheme ve Common Lisp ile aşina değilsinizdir. Her iki dil de kendi başlarına çok güçlü, ancak hiçbirinin genel kabulü yok. Bu neden? Çok fazla lehçe olduğu için olabilirdi; hangisini seçersiniz? Bu türden bir karşılaştırma çok aydınlatıcı olabilir ve OP, görüşüme göre, çok özel ve yanıtlanabilen cevaplarla kapsamı sınırlandırma sorununu dikkatlice ifade etti.
Robert Harvey

13
Millet, soruyu kapatmayın çünkü hoşunuza gitmiyor veya onunla ilişki kuramıyorsunuz. Açıkça "gerçek" bir soru; kapatmak için daha iyi bir neden bulamazsanız, kapatmak için oy kullanmamalısınız.
Robert Harvey,

4
Richard Stallman'a cevabı için e-posta gönderebilirsin.
wassimans

Yanıtlar:


100

Lisans derecem Bilişsel Bilimler ve Yapay Zeka bölümlerinde yapıldı. Bundan sonra Lisp'e tek seferlik bir giriş yaptım. Dilin ilginç olduğunu düşündüm ("zarif" gibi) ama Greenspun'un Onuncu Kuralı'na gelene kadar pek düşünmedim:

Yeterince karmaşık olan herhangi bir C veya Fortran programı, Ortak Lisp'in yarısının geçici, gayri resmi olarak belirlenmiş, böcek basması, yavaş uygulanmasını içerir.

Greenspun'un amacı (kısmen) birçok karmaşık programın yerleşik tercümanlara sahip olduğuydu. Tercümana bir dile çevirmek yerine, yerleşik bir tercümana (veya derleyiciye) sahip olan Lisp gibi bir dili kullanmak daha mantıklı olabilir.

O zamanlar, özel bir dil için özel bir tercüman kullanarak kullanıcı tanımlı hesaplamalar yapan oldukça büyük bir uygulama üzerinde çalışıyordum. Lisp'teki çekirdeğini büyük ölçekli bir deney olarak yeniden yazmaya karar verdim.

Kabaca altı hafta sürdü. Orijinal kod ~ 100,000 satır Delphi (bir Pascal çeşidi) idi. Lisp'te bu ~ 10.000 satıra indirildi. Daha da şaşırtıcı olanı, Lisp motorunun 3-6 kat daha hızlı olmasıydı. Ve bunun bir Lisp neofitinin eseri olduğunu unutmayın! Tüm bu deneyim benim için oldukça açıktı; ilk defa performansı ve etkileyiciliği tek bir dilde birleştirme olasılığını gördüm.

Bir süre sonra web tabanlı bir proje üzerinde çalışmaya başladığımda birçok dilde seçmeler yaptım. Lisp ve Scheme'i karışıma dahil ettim. Sonunda bir Scheme uygulamasını seçtim-- Chez Scheme . Sonuçlardan çok memnun kaldım.

Web tabanlı proje, yüksek performanslı bir "seçim motoru" . Scheme'i, veri işlemeden veri sorgulamaya ve sayfa oluşturmaya kadar birçok farklı şekilde kullanıyoruz. Birçok noktada aslında farklı bir dille başladık, ancak aşağıda kısaca anlatacağım nedenlerden dolayı Scheme'ye geçtik.

Şimdi sorunuza cevap verebilirim (en azından kısmen).

Seçmeler sırasında çeşitli Lisp ve Scheme uygulamalarına baktık. Lisp tarafında baktık (inanıyorum) Allegro CL, CMUCL, SBCL ve LispWorks. Düzeni tarafında baktık (inanıyorum) Bigloo, Chicken, Chez, Gambit. (Dil seçimi uzun zaman önceydi; bu yüzden biraz pusluyum. Önemliyse bazı notlar alabilirim.)

Vuruştan hemen sonra a) yerli iplikler ve b) Linux, Mac ve Windows desteği aradık. Bu iki koşul bir araya gelince herkesi etkiledi (sanırım) Allegro ve Chez dışarı - yani değerlendirmeye devam etmek için çok iş parçacığı gereksinimini gevşetmek zorunda kaldık.

Bir takım küçük programlar hazırladık ve bunları değerlendirme ve test için kullandık. Bu bir takım sorunları ortaya çıkardı. Örneğin: Bazı uygulamalar bazı testlerin tamamlanmasını engelleyen bazı kusurları vardı; bazı uygulamalar çalışma zamanında kodu derleyemedi; bazı uygulamalar çalışma zamanı derlenmiş kodunu önceden derlenmiş kodla kolayca entegre edemedi; bazı uygulamalarda diğerlerinden daha belirgin (ya da açıkça daha kötü) çöp toplayıcıları vardı '; vb.

İhtiyaçlarımız için sadece üç ticari uygulama - Allegro, Chez ve Lispworks - temel testlerimizden geçti. Sadece üçü Chez, tüm testleri uçan renklerle geçti. O zamanlar Lispworks'ün herhangi bir platformda yerel ipliği olmadığını düşünüyorum (sanırım şimdi yapıyorlar) ve Allegro'nun sadece bazı platformlarda yerel iplikleri olduğunu düşünüyorum. Ayrıca, Allegro, çok sevmediğim bir "bizi arayın" çalışma süresi lisans ücretine sahipti. Lispworks'ün çalışma zamanı ücreti olmadığını ve Chez'nin basit (ve çok makul) bir düzenlemeye sahip olduğuna inanıyorum (ve sadece derleyiciyi çalışma zamanında kullanıyorsanız başladı).

Hem Lisp'te hem de Scheme'de biraz önemli kod parçaları üretmiş olmak bazı karşılaştırma ve karşıtlık noktalarıdır:

  • Lisp ortamları çok daha olgun. Paranın karşılığını daha çok alırsın. (Bunu söyledikten sonra, daha fazla kod daha fazla hataya da eşittir.)

  • Lisp ortamlarını öğrenmek çok daha zor. Uzman olmak için daha fazla zamana ihtiyacınız var; Common Lisp çok büyük bir dil - ve ticari uygulamaların üzerine eklediği kütüphanelere ulaşmadan önce bu. (Scheme'nin sözdizimi vakası, Lisp'teki herhangi bir şeyden çok daha ince ve karmaşık olduğunu söyledi.)

  • Lisp ortamlarında ikili dosya üretmek biraz daha zor olabilir. Gereksiz bitleri kaldırmak için resminizi "sallamanız" gerekir ve bu işlem sırasında programınızı doğru şekilde kullanmazsanız, daha sonra çalışma zamanı hataları ile sonuçlanabilirsiniz. . Buna karşılık, Chez ile ihtiyaç duyduğu tüm diğer dosyaları içeren üst düzey bir dosya derliyoruz ve işimiz bitti.

Daha önce, Scheme'yi başlangıçta istemediğimiz yerlerde kullanmaya başladığımızı söyledim. Neden? Başımın üstündeki üç nedeni düşünebilirim.

İlk önce, Chez'ye (ve geliştiricisi Cadence'e) güvenmeyi öğrendik. Takımdan çok şey istedik ve tutarlı bir şekilde teslim edildi. Mesela, Chez tarihsel olarak önemsiz derecede küçük bir kusur yaşadı ve hafıza yöneticisi çok, çok iyi oldu.

İkincisi, Chez'den aldığımız performansı sevmeyi öğrendik. Bir komut dosyası dili gibi hissettiren bir şey kullanıyorduk - ve yerel kod hızını alıyorduk. Önemi olmayan bazı şeyler için - ama asla zarar vermedi ve bazen çok yardımcı oldu.

Üçüncüsü, Scheme'nin sağlayabileceği soyutlamayı sevmeyi öğrendik. Bu arada sadece makro demek istemiyorum; Kapanışlar, lambdalar, kuyruk çağrıları, vb. Gibi şeyleri kastediyorum.

Scheme mükemmel mi? Hayır; bu bir takas. Birincisi, bireysel geliştiricilerin daha etkili olmalarını sağlar - ancak geliştiricilerin birbirlerinin kodlarını çiğnemeleri daha zordur, çünkü çoğu dilin (örneğin, döngüler için) sahip olduğu bildiriler Şema'da (örneğin, yapmanın milyonlarca yolu vardır) a döngü için). İkincisi, konuşmak, kiralamak, ödünç almak vb. İçin çok daha küçük bir geliştirici havuzu var.

Özetlemek gerekirse, şunu söyleyebilirim: Lisp ve Scheme, başka hiçbir yerde yaygın olarak bulunmayan bazı yetenekler sunar. Bu yetenek bir takastır, yani sizin durumunuzda anlamlı olan daha iyi olmuştu. Bizim durumumuzda Lisp veya Scheme ile gitmek arasındaki belirleyici faktörlerin, dil veya kütüphane özellikleri ile olduğundan çok temel özelliklerle (platform desteği, platform konuları, çalışma zamanı derlemesi, çalışma zamanı lisansı) yapması daha fazla. Yine, bizim durumumuzda da bir takas oldu: Chez ile istediğimiz temel özellikleri elde ettik, ancak ticari Lisp ortamlarının sahip olduğu geniş kütüphaneleri kaybettik.

Ayrıca, sadece yinelemek için: uzun zaman önce çeşitli Lisps ve Şemalara baktık; o zamandan beri hepsi gelişti ve gelişti.


1
Vay canına, eğer bir şekilde Lisp uygulamasından 3-6x daha yavaş çalışmayı başardıysa, gerçekten de korkunç bir Delphi kodu olmalı ! :(
Mason Wheeler

2
+1: Bu yazıyla ilgili en ilginç şey, Lisp'te büyük bir proje yaptıktan sonra Lisp'ten Scheme'ye geçmiş olmanız. (Belki de çok uzun süredir comp.lang.lisp'i gizliyordum.)
Larry Coleman

25
"Vay, eğer bir şekilde Lisp uygulamasından 3-6x daha yavaş bir performans sergilemişse, gerçekten de korkunç bir Delphi kodu olmalı!" Doğru, bunu daha iyi açıklayamadığım için başarısız olduğum olarak kabul edeceğim. Lisp uygulaması, kullanıcı ifadelerini Lisp ifadelerine (son derece kolay bir işlem) dönüştürdü ve ardından Lisp ifadelerini yerel koda (tam optimizasyon ile) derledi. Greenspun'un Onuncu Kuralının anlamı budur.
Michael Lenaghan

1
Harika cevap! En azından daha iyisi ortaya çıkana kadar onu seçeceğim :) Bir soru: “uzun zaman önce” alanın durumuna göre Chez Scheme ile gitmeye karar verdiğini söylüyorsun. Bir yıl belirtebilir misiniz?
SuperElectric

11
Bu nokta, LISP uygulamasının bir tercümana güvenmek yerine, bir şeyi makine koduna derlemekte serbest olduğu konusunda ince ve oldukça faydalıdır. "Let Over Lambda" kitabı, bunun kesin olarak, PERL regexp sözdizimini klonlayan portatif Common LISP regexp paketinin PERL'yi önemli bir faktörden daha iyi performans göstermesinin tam olarak bu olduğuna işaret ediyor. PERL, aşağıya doğru, düzenli bir tercümana sahiptir. Common LISP paketi, regexps'i kodlamaya kadar derler.
John R. Strohm

37

Genelde bir linki cevap olarak yapıştırmaktan hoşlanmam ama bu konuda bir blog yazısı yazdım. Kapsamlı değildir, ancak bazı önemli noktaları ele geçirir.

http://symbo1ics.com/blog/?p=729

Düzenleme : İşte temel noktalar:

  1. VARLIĞI : Her iki lisps diğer lisps bir demet sonra geldi. Şema minimal, aksiyomatik yolu izlemiştir. CL Barok rotasını aldı.
  2. CASE : Genelde Şema büyük / küçük harf duyarlıdır. CL değil (olabilir). Bu bazen cevapsız, ancak pratikliği tartışmalı (bana göre).
  3. İSİMLER : CL'deki sembollerin adları çoğu zaman garip ve kafa karıştırıcıdır. TERPRI, PROGNVb Şema genellikle çok mantıklı ismi vardır. Bu CL de kaçırılan bir şey.
  4. FONKSİYONLAR : CL, ayrı bir fonksiyon isim alanına sahiptir. Bu edilir değil Şemada kaçırdı. Tek bir isim alanına sahip olmak, genellikle CL'de zor veya zor olan çok temiz bir işlevsel programlamaya izin verir. Fakat bunun bir bedeli var --- bazen Scheme'de " list" ila " lst" gibi isimleri gizlemeniz gerekebilir .
  5. MAKROS : Scheme'deki en düşük seviyeli kirli makroları özlüyorum. Evet, syntax-rulesgerçekten bazı şeyleri kesmek istene kadar her şey yolunda ve zahmetli. Öte yandan, CL'de hijyenik makrolar bazen kaçırılmaktadır. Bunları yapmak için standart bir yol kullanmamak, tekerleği yeniden icat etmek anlamına gelir.
  6. PORTABİLİTE : Her iki dilin de standartlaştırılmasına rağmen, CL'nin daha taşınabilir olması sık sık söz konusudur. CL daha büyüktür ve bu nedenle harici kütüphaneler olmadan kullanmak için daha standart özellikler vardır. Aynı zamanda daha fazla uygulamaya bağımlı olan şeylerin taşınabilir olarak yapılabileceği anlamına gelir. Ayrıca, Şema, çoğu biraz uyumsuz olan trilyon bir uygulamaya sahip olmaktan muzdariptir. Bu CL'yi çok çekici kılar.
  7. KÜTÜPHANELER : Son noktamla çok ilgili. Şema SRFI'lere sahiptir ancak evrensel olarak kabul edilmemektedir. Kütüphanelerle çalışmanın taşınabilir bir yolu yoktur. Öte yandan CL, yolları var. Ve Quicklisp, Tanrı'nın (Xach) bir armağanıdır --- bir çeşit kütüphanenin kullanımı.
  8. UYGULAMALAR : Program pek çok uygulamaya sahip olmaktan muzdariptir. Gerçek bir kanonik uygulama yoktur. Öte yandan, CL bazı çok yüksek performans veya özel kullanım uygulamalarına sahiptir (yüksek performans: SBCL, ticari: Allegro, gömülü: ECL, taşınabilir: CLISP, Java: ABCL, ...).

Sadece biraz yukarıda birinci kişiyle konuştuğum halde, neyi özlediğimi ve neyi özlemediğimi açıkça belirtmeliyim.

[Bunlar çok genelse özür dilerim. Daha ayrıntılı bilgi isteyebilirsiniz. Mesajda bazı özellikler var.]


Peki ya (gerçekten) kısa bir kısa tanıtım özeti? ^^
Dave O.

2
Lütfen olayları satır içi yapın. Cevaplar kendi kendine ayakta durmalıdır.

1
@Dave O. ve @ Thorbjørn Ravn Andersen: İstenildiği şekilde bir özet eklendi. Teşekkürler.
Quadrescence,

2
"Barok rota"! Bunu koymak için ne mükemmel bir yol.
Mark C,

Common Lisp, büyük / küçük harf duyarlıdır, ancak değerlendirmeden önce girişini büyük harfe dönüştürür. Sembollerden küçük harfleri alıntı yaparak alabilirsiniz. İsim sorunu, Scheme'nin kötü eski isimlerden kurtulmuş olması ve CL'nin olmamasıydı.
David Thornley

25

Geçenlerde C sürümüne ve Java sürümüne sahip bir kütüphaneyi kullanarak bir ev projesine başladım. Lisp'i proje için kullanmak istedim ve Common Lisp, Scheme veya Clojure kullanmak arasında yaklaşık bir ay geçirdim. Her üçünde de bazı deneyimlerim var, fakat sadece oyuncak projelerim var. Hangisini seçtiğimi söylemeden önce, size onlardan biriyle olan deneyimim hakkında biraz bilgi vereceğim.

PLT Racket, yalnızca editörden gelen ifadeleri değerlendirmenize izin vermekle kalmaz, aynı zamanda parens yerine parantezler yazmanızı ve uygun olduğunda tekrar parenslere dönüştürmenizi sağlar. Racket ayrıca kurulumlu büyük bir kütüphaneye sahiptir ve indirmeye hazırdır. Görsel hata ayıklayıcı da yardımcı olur.

Common Lisp uygulamamın (SBCL) bir IDE'si yok, ancak Emacs ve SLIME kullanmak için açık kaynaklı CL uygulamaları ile geleneksel. Bu kombinasyon çok verimli olabilir. İfadeleri kaynak dosyaya yazarken değerlendirebilme özelliğinin yanı sıra, tüm emacs düzenleme komutlarını içeren bir REPL de vardır, bu nedenle kod kopyalama her iki şekilde de etkili olabilir. REPL arabelleğinde görüntülenen nesneler bile kopyalanabilir ve yapıştırılabilir. Alt+(ve Alt+)eşleşen parantezler ve girintilerle başa çıkmak için etkilidir.

Yukarıdaki Emacs özelliklerinin tümü Clojure için de mevcuttur. Clojure ile ilgili düzenleme tecrübem Lisp ile aynı. Java birlikte çalışması iyi çalıştı ve olgunlaştıktan sonra bir Clojure projesi yapmak istiyorum.

Üçünü de (Common Lisp, Racket ve Clojure) kullanarak kütüphaneye erişebildim, ancak proje için Common Lisp'i seçtim. Karar faktörü, FFI’nin Common Lisp’te kullanımı daha kolay olmasıydı. CFFI, örnek kod ve her yöntemin ayrıntılı açıklamaları ile çok iyi bir el kitabına sahiptir. Bir öğleden sonra 20 C fonksiyonunu ayarlayabildim ve o zamandan beri bu koda dokunmadım.

Diğer faktör ise Common Lisp’e Clojure veya R6RS Scheme’den daha fazla aşina olmamdı. Practical Common Lisp ve Graham'ın kitaplarının çoğunu okudum ve Hyperspec ile rahat edeceğim. Henüz çok "lispy" kodu değil, ancak daha fazla deneyim kazandıkça değişeceğinden eminim.


Detay için teşekkürler! Sizi, SBCL’nin FFI’nin Clojure’den daha kolay kullandığını düşündüğünüzü doğru anlıyor muyum? Öyleyse, Java yöntemlerini doğrudan sarmak zorunda kalmadan doğrudan Clojure'den çağırabildiğiniz için çok şaşırdım. (Ya da yerel kod da aramanız gerekiyordu?)
SuperElectric

6
@ SuperElectric: Clojure'dan "yerleşik" Java yöntemlerini kullanmak önemsizdir; indirilen bir kütüphanede bulunan Java yöntemlerini çağırmak: çok fazla değil. SBL'den CFFI ile çalışan ilk C yöntemimi elde etmemi sağlamak için sınıf yolunu almak ve satırları doğru almak için gerçekten çok zaman harcadım. Ama ben Java uzmanı değilim, bu yüzden Kilometreniz değişebilir.
Larry Coleman

21

Hem CL hem de Racket programlarım.

Şimdi Common Lisp'te bir Web sitesi geliştiriyorum ve Racket'teki önceki işverenim için bir dizi kurum içi program yazdım.

Şirket içi kod için Racket'i seçtim (daha sonra PLT Şeması olarak da bilinir) çünkü işveren bir Windows mağazasıydı ve LispWorks için ödeme yapmalarını sağlayamadım. Windows için tek iyi açık kaynaklı CL uygulaması, işlemcide SSE desteği gerektiren CCL'dir (ve hala). Ucuz olan işveren Stone Age donanım kullanıyordu. İşveren iyi bir donanıma sahip olsa bile, Common Lisp'te sonuçlanan tek GUI kütüphanesi, sadece Unix üzerinde çalışan McCLIM'dir. Racket, projemin başarısı için kritik olan Unix ve Windows üzerinde çalışan iyi bir GUI kitaplığına sahip.

İlkel DrRacket editörü ile bir yıldan fazla zaman geçirdim. EMACS, daha sonra MrEd olarak bilinen Racket'in GUI sürümünü Windows'ta daha düşük seviyeye çeviremiyordu. İmleçteki ifadeyi tek bir tuş vuruşuyla değerlendirebilmek zorunda kalmak zorunda kaldım. Bunun yerine, S ifadesini manuel olarak seçmek, kopyalamak, REPL penceresini tıklatmak zorundaydım (çünkü ona geçiş yapmak için herhangi bir tuşa basılmadı) ve sonra S ifadesini yapıştırın. Ayrıca, kullandığım fonksiyon veya makronun beklenen argümanlarını gösterebilecek bir editör olmadan da yapmak zorunda kaldım. DrRacket, SLIME yerine geçmez.

İşveren, bir SELECT sorgusu sürümüne cevap verebilmek için gereksiz görünüşte fazla bilgi gerektiren karmaşık bir XML API içeren tescilli bir veritabanı kullanıyordu. Hem bu API'ye XML yaymak hem de yanıtları ayrıştırmak için HTMLPrag'ı kullanmaya karar verdim. Harika çalıştı.

SQL'e benzeyen formları yazarak fazla karmaşık XML API ile etkileşime girmemi sağlayacak bir makro yazmak için Racket'in aşırı karmaşık "sözdizimi-vaka" makro sistemini öğrenmek zorunda kaldım. Benim elimde DEFMACRO olsaydı bu kısmı çok daha kolay olurdu. Bununla birlikte, elde edilmesi daha fazla çaba göstermesine rağmen, sonuç yine de kusursuzdu.

Dahası, Common Lisp'in LOOP makrosu olmadan yapmak zorunda kaldım. Racket, yalnızca kodun çoğunu yazdıktan sonra bir alternatif sunmaya başladı ve alternatif hala LOOP'a göre daha berbat (Racket'in geliştirme ekibi daha iyi olduğunu iddia etse bile - yanlışlar). Listeleri yinelemek için "araba" ve "cdr" kullanılan birçok LET formunu yazdım.

Araba ve cdr'dan bahsetmişken, hiçbir şey Scheme'nin (araba '())' nın bir hata olduğu yorumundan daha sinir bozucu değildir. Racket'in büyük küçük harf duyarlılığından yararlandım ve Common Lisp'in semantiğine sahip olan CAR ve CDR'yi kullandım. Ancak, '() ve #f öğelerinin ayrılması,' () öğesinin varsayılan bir değer olarak geri döndürülmesini çok daha az kullanışlı hale getirir.

Ayrıca UNWIND-PROTECT'in yeniden uygulanmasına son verdim ve Racket'in bıraktığı boşluğu doldurmak için kendi yeniden başlatma sistemimi icat ettim. Raket topluluğunun, yeniden başlatmanın çok faydalı ve uygulaması kolay olduğunu öğrenmesi gerekir.

Racket'in izin değerleri formu aşırı derecede ayrıntılıydı, bu yüzden MULTIPLE-VALUE-BIND uygulamıştım. Bu kesinlikle gerekliydi çünkü Racket , kullansanız da kullanmasanız da, üretilen tüm değerleri almanızı gerektirir .

Daha sonra, sadece HTMLPrag gibi bir şey olmadığını bulmak için Common Lisp'te bir eBay XML API istemcisi yazmaya çalıştım. HTMLPrag kandırmak için faydalıdır. Bu projeyi Racket'te bitirdim. Rackset'in Literatür Programlama olanaklarını denedim, sadece Dünya'da sıradan koddan daha zor okunması zor yazılan kod okuma, ya da yanlış yazılmış "aşırı yorumlar" okur kodunu bulan tek programcı olduğumu bulmak için.

Yeni projem, Doğru Seçim olan Common Lisp'te yapılıyor çünkü Raket topluluğu bu proje için gerekli olan paralelliğe inanmıyor. Racket'ten kaçırmış olabileceğimi düşündüğüm tek şey devamlılıktı. Bununla birlikte, yeniden başlatma işlemlerini kullanarak ihtiyacım olanı yapabildim ve geçmişe bakıldığında muhtemelen basit bir kapatma işlemi yapabilirdi.


2
Kendim denemedim, ancak Emacs ile komut satırı raket programını kullanan insanlardan blog yazıları gördüm. Örneğin: bc.tech.coop/scheme/scheme-emacs.htm
Larry Coleman

5
Adil olmak gerekirse, aptalca bir Şema POV'sundan şeylere yaklaşmaya çalışmak yerine CL yazmak isteyen Scheme'ye geldiğiniz anlaşılıyor. Örneğin, şema döngü kullanmak yerine tekrarı teşvik etmiyor mu?
Kızak

@ArtB Şeması sadece özyinelemeyi teşvik etmiyor, onu gerektiriyor , bu yüzden elbette yukarıda belirtilen proje büyük bir özyineleme kullandı. Ve bu sadece tekrarlama eklemeye yaradı (örneğin özyinelemeli çağrının bir formun her dalına bir özyinelemeli çağrısının bir kopyasını eklemeniz gerekir cond) ve hatalar (döngü sonlandırma testini o zaman doğru yazdım mı?) Bugün bile izlenim edindim. Bu Raket temel olarak profesyonel programcılar için değil öğrencilere yöneliktir. Bunu kullanmam dışında birisini duyduğumda, "Başlangıç ​​Öğrencisi" alt dilini kullanıyorlar ve bu bir ders için.
Away Account

COND'lar arasında kodu tekrarlıyorsanız, sadece başka bir işleve ihtiyacınız olduğunu mu söylüyorsunuz?
Kızak

@ArtB Döngü işlevini farklı argümanlarla çağıran bir işlev? Bu biraz anlamsız olurdu. Bu tür tekrarları hemen hemen kimsenin Şema kodunda görüyorsunuz. Racket'in kendi kaynak kodunda bile örnekler var.
Away Hesabı Atın

5

Şema akılda ayrı bir derleme ile tasarlanmıştır. Sonuç olarak, makrolarının gücü genellikle, zayıf, sınırlayıcı bir hijyenik makro sistem yerine bir Common Lisp tarzı defmacroya izin veren uzantılarda bile ciddi şekilde sınırlandırılır. Bir sonraki kod satırında hemen kullanım için amaçlanan başka bir makroyu tanımlayan bir makro tanımlamak her zaman mümkün değildir. Ve böyle bir olasılık, verimli eDSL derleyicileri uygulamak için çok önemlidir.

Metaprogramming stilimin hijyene yeterince çevrilemediğinden, yalnızca R5RS hijyenik makroları olan Şema uygulamalarının benim için pek faydalı olmadığını söylememe gerek yok.

Neyse ki, bu sınırlamaya sahip olmayan Şema uygulamaları (örneğin, Raket) vardır.


1
Merhaba, son zamanlarda Raket kullanarak Scheme ile ayaklarımı ıslatmaya başladım. Racket'te hijyenik olmayan makrolar kullanmaya hızlı bir örnek verebilir misiniz? Mevcut makro türleri, CL ve Scheme arasında en çok tartışılan noktalardan biri gibi görünüyor.
orange80

@ orange80, yaklaşımlardan biri docs.racket-lang.org/mzlib/mzlib_defmacro.html kullanmaktır . Tabii ki R6RS modunda daha az kısıtlayıcı bir yöntem var.
SK-mantık

@ SK-mantık çok hijyenik olmayan makrolarla ne yapıyorsunuz?
Kızak,

1
@ArtB, eDSL'leri, kaynak AST'ları ile oldukça fazla şey yapabilecek derleyici işlevleri olarak uyguluyorum. Hijyen, böyle bir yaklaşım içinde tam bir sıkıntıdır. Nasıl çalıştığına bir göz atabilirsiniz: github.com/combinatorylogic/mbase
SK-mantık
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.