Yanıtlar:
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:
set-cdr!
ve set-car!
daha ziyade set-mcar!
sadece özellikle değiştirilebilir olarak oluşturulan çiftler üzerinde çalışır.letrec
çağrılır letrec*
ve R5RS'de yoktur, Raket'te R5RS ve R6RS çağrısı letrec
yoktur.( ... )
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.
()
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.
#%app
:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
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.
PLT Şemasından Rakete isim değişikliği için gerekçe , Raket sitesinde tartışılmaktadır .
Ş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:
Modül ve makro sistemi RnRS spesifikasyonundan çok daha geneldir. #lang
Okuyucu / 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ı, cons
yapıyı değişmez bir çift yapmaktır ( mcons
değ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.
Raket, R6RS şemasına dahil olmayan, "eşleştirme" gibi pek çok güzel dil yapısı içerir .
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-case
dayalı bir makro yazmak basittir ve birçok insanda vardır. Scheme için taşınabilir match
kütüphaneler var. Clojure var core.match
.
()
geçersizdir, kendini değerlendirmez. Ayrıca, Raket yapar daha kısıtlı olmasıletrec
- örneğin, birr5rs
dili;letrec*
-like sürümünü varsayılan dilde kullanmak kasıtlı bir seçimdir .