Raketin Şemadan farkı nedir?


184

Raket, Scheme'in torunudur. Raketin R6RS'den farkı nedir? Ne ekledi ya da aldı, ya da sadece farklı mı?

Racket'in bir dilden daha fazlası olduğunu, diller için bir platform olduğunu anlıyorum. Ama ana Raket lehçesinden bahsediyorum.

Yanıtlar:


132

Raket eninde sonunda R5RS'ye dayanır, R6RS'ye dayanmaz ve her ikisinin de katı bir üst kümesi değildir. Bunun 'Şema' olarak adlandırılabileceğini sanmıyorum çünkü herhangi bir Şema standardıyla geriye dönük olarak uyumlu değil.

Çoğu uygulama uzantılar sunar, ancak aksi takdirde geriye dönük olarak uyumludur, elbette Racket ile birlikte gelen derleyici R5RS veya R6RS modunda da çalışabilir. Raket modunda çalışan geçerli R5 / 6RS Düzeni reddedilebilir, çalışma zamanı hatalarına neden olabilir veya olması gerekenden farklı davranabilir. Bununla birlikte, geriye dönük uyumlu olmadığı ana noktalar şunlardır:

  • Raket yoktur set-cdr!ve set-car!daha ziyade set-mcar!sadece özellikle değiştirilebilir olarak oluşturulan çiftler üzerinde çalışır.
  • Raket çağrıları R6RS'de letrecçağrılır letrec*ve R5RS'de yoktur, Raket'te R5RS ve R6RS çağrısı letrecyoktur.
  • Racket'te, R5RS'de en önemlisi boş liste olan bir hatayı artıracak birçok şey kendi kendini değerlendiriyor .
  • Raket büyük / küçük harfe duyarlıdır, ancak R6RS büyük / küçük harfe duyarlıdır
  • Raket davranır ( ... )ve [ ... ]eşdeğer olarak R5RS davranmaz, ancak R6RS davranır .

Muhtemelen daha fazlası vardır, ancak diğer birçok parçada raket, Scheme'nin bir üst kümesidir.


24
Rakette ()geçersizdir, kendini değerlendirmez. Ayrıca, Raket yapar daha kısıtlı olması letrec- örneğin, bir r5rsdili; letrec*-like sürümünü varsayılan dilde kullanmak kasıtlı bir seçimdir .
Eli Barzilay

9
@ Eli, whoops, haklısın, Swindle modunda koşan raket ()kendini değerlendirmeyi düşünüyor gibi görünüyor , ben bununla kafam karıştı. ()Ortak Lisp'de olduğu gibi Scheme'de neden kendini değerlendirmediğini hiç anlamadım.
Zorf

@Zorf Aşırı yüklenerek kolayca değiştirilebilir #%app:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron

2
Bu cevap güncellenmelidir. Raketin özellik seti uzak vb modülleri ve dil tanımları ile, şimdi Şeması en ağır basar
CinchBlue

1
@MaliRemorker Ne demek istediğinizi tam olarak anlamadım, ama Şema şu anda R7RS'de ve R6RS'deydi. Ancak Racket hala R6RS özellik setini aşıyor.
CinchBlue

36

Yukarıda belirtildiği gibi değişmez listeler içerir. Ayrıca R6RS kayıt sisteminden biraz daha temiz bir yapı sistemi içerir. Nesneye yönelik bir sınıf ve nesne sistemine sahiptir. Sözleşme ile tasarım için yerel destek vardır. ML modül sistemini anımsatan bir birim sisteminin yanı sıra R6RS modül sistemine çok benzer bir modül sistemine sahiptir. Eminim bahsettiğim kadar çok şeyi unuttum.

Yeniden adlandırma işleminin bir pazarlama hilesi dışında bir şey olarak yararlı olduğundan emin değilim, ancak raket kesinlikle şemanın ayrı bir lehçesi.


24
Bence yeniden adlandırma, standart olmayan eklemelerle bir grup Scheme lehçesi olmak istemedikleri için - bir sürü daha standart içeren bir Şema tabanlı dil olmak istiyorlardı. PLT Şemasını "sadece" bir şema olarak sınıflandırmak, Ruby'yi Mirah'ın bir lehçesi olarak sınıflandırmak gibidir - yanlış değildir, ancak dilin güçlü yönlerini küçümser.
Chuck

5
Farklı bir ad kullanmak akıllıca bir karardır: ortak adı olan farklı diller için aynı adı kullanmak IMO kafa karıştırıcıdır. Dil, Şemayı bir alt küme olarak içeriyordu, ancak çok fazla ekleme içerdiğinde bile adı değiştirirdim, çok farklı bir programlama stilini teşvik edecekti.
Giorgio


18

Şema programlama dili üzerindeki R5RS dil spesifikasyonu, birden çok Şema uygulayıcısı arasındaki fikir birliğine dayanmaktadır. Bu, dilin çok kararlı olduğu anlamına gelir. Ayrıca, birçok kullanışlı özelliğin R5RS standardının bir parçası olmadığını ima eder.

Raket R5RS üzerine inşa edilmiş ve büyük ölçüde genişletilmiştir. Bazı uzantılar makro olarak tanımlanır, ancak bazı özellikler çalışma zamanı sisteminin desteğini gerektirir.

Rakette yalnızca makrolar tarafından uygulanamayan özellikler:

  • sınırlı süreler (çağrı / cc'den daha genel)
  • devam işaretleri
  • İş Parçacığı
  • yerler
  • ffi

Modül ve makro sistemi RnRS spesifikasyonundan çok daha geneldir. #langOkuyucu / dil spesifikasyonu ile birlikte özel dilleri (özel sözdizimi ile) tanımlamayı ve bunları normal Raket programlarıyla kullanmayı mümkün kılar.

Birkaç durumda Racket, davranışı R5RS'den sapan yapılara sahiptir. En belirgin olanı, consyapıyı değişmez bir çift yapmaktır ( mconsdeğişebilir bir çift oluşturur). Değişmez çiftlere sahip olmanın bir avantajı, lengthşimdi O (1) itfa edilmiş sürede gerçekleşmesidir.


2
... ama O (1) listesinin eklenmesini imkansız kılıyor.
Ness Ness

16

Raket, R6RS şemasına dahil olmayan, "eşleştirme" gibi pek çok güzel dil yapısı içerir .


3
"Eşleşme" neden güzel bir özellik olsun ki? En azından, bir görüşü ifade ettiğinizde, bunun kısa bir açıklamasını yapmalısınız, böylece Racket'e aşina olmayan insanlar "eşleşmenin" teorik olarak neden yararlı olduğunu anlayabilirler.
nbro

1
Desen Eşleme, fonksiyonel programlama arka planlarına sahip birçok dilde gerçekten istenen bir özelliktir, maalesef R6RS veya Common Lisp bile bunu varsayılan olarak uygulamamaktadır, bu yüzden Evet, Raketin sağladığı gerçekten güzel ve farklı bir özelliktir. Örneğin Haskell, Elixir, Rust ve F # gibi diller bu tür yapıları sağlar ve yoğun olarak kullanılır. Şahsen Lisp programlamasını çoğunlukla Common Lisp'te yapıyorum ve çoğu durumda desen eşleştirme uygulamasının eksikliğini özlüyorum.
Manoel Vilela

1
matchçok güzel ama neyse ki sadece bir makro, bu yüzden Lisps'e kolayca eklenemez. Ortak Lisp, listelerde ışık düzeni eşleştirmesi yapabilir destructuring-bind. Buna destructuring-casedayalı bir makro yazmak basittir ve birçok insanda vardır. Scheme için taşınabilir matchkütüphaneler var. Clojure var core.match.
Lassi

Makrolar, genellikle özel semantiklere sahip oldukları için kodun okunmasını zorlaştırabilir, bu nedenle dil her zaman tüm genel amaçlı makroları standartlaştırmalıdır, böylece herkes kendi makrolarını oluşturmaz. Desen eşleştirme, Arc & Clojure & Racket & Ocaml & Haskell'de olduğu gibi, niyeti daha doğrudan belirlediği için varsayılan olmalıdır. Caddr seviyesi çok düşük.
aoeu256

12

Büyük bir örnek olarak, Raket listeleri varsayılan olarak değiştirilemezken, Şemalar değiştirilebilir. Raket ayrıca, diğer Şemaların içermediği birçok standart kitaplık (örn. Web Sunucusu) içerir.

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.