Jawaban:
Racket pada akhirnya didasarkan pada R5RS, dan bukan R6RS dan bukan superset ketat dari keduanya. Saya tidak berpikir itu bisa disebut 'Skema' karena itu tidak kompatibel dengan standar Skema apa pun.
Sebagian besar implementasi menawarkan ekstensi, tetapi sebaliknya kompatibel, tentu saja, kompiler yang datang dengan Racket juga dapat berjalan dalam mode R5RS atau R6RS. Skema R5 / 6RS yang valid yang berjalan dalam mode raket dapat ditolak, menyebabkan kesalahan runtime, atau berperilaku berbeda dari yang seharusnya. Dengan itu, poin utama di mana itu tidak kompatibel adalah:
set-cdr!
dan set-car!
, melainkan set-mcar!
hanya berfungsi pada pasangan yang secara khusus dibuat sebagai dapat diubah.letrec
disebut letrec*
dalam R6RS dan tidak ada di R5RS, apa panggilan R5RS dan R6RS letrec
tidak ada di Racket.( ... )
dan [ ... ]
setara, R5RS tidak, tetapi R6RS tidak.Mungkin ada lebih banyak, tetapi pada sebagian besar bagian raket adalah superset dari Skema.
()
evaluasi diri, aku bingung dengan yang itu. Saya tidak pernah benar-benar mengerti mengapa ()
tidak mengevaluasi diri dalam Skema seperti pada Common Lisp.
#%app
, meskipun:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Ini berisi daftar abadi, seperti yang disebutkan di atas. Ini juga berisi sistem struktur yang sedikit lebih bersih daripada sistem catatan R6RS. Ini memiliki kelas berorientasi objek dan sistem objek. Ini memiliki dukungan asli untuk desain dengan kontrak. Ini memiliki sistem unit yang mengingatkan sistem modul ML, serta sistem modul seperti sistem modul R6RS. Saya yakin saya sudah lupa banyak hal yang saya sebutkan.
Saya tidak yakin bahwa mengganti nama itu berguna sebagai selain gimmick pemasaran, tetapi raket jelas merupakan dialek skema yang berbeda.
Dasar pemikiran untuk perubahan nama dari Skema PLT ke Racket dibahas di situs Racket .
Spesifikasi bahasa R5RS pada bahasa pemrograman Skema didasarkan pada konsensus antara beberapa implementor Skema. Ini menyiratkan bahwa bahasa ini sangat stabil. Ini juga menyiratkan bahwa banyak fitur berguna bukan bagian dari standar R5RS.
Racket telah dibangun di atas R5RS dan sangat diperluas. Beberapa ekstensi didefinisikan sebagai makro, tetapi beberapa fitur memerlukan dukungan dari sistem runtime.
Fitur di Racket tidak dapat diterapkan oleh makro saja:
Modul dan sistem makro jauh lebih umum daripada spesifikasi RnRS. Bersama dengan #lang
spesifikasi pembaca / bahasa memungkinkan untuk mendefinisikan bahasa khusus (dengan sintaks khusus) dan menggunakannya dengan program Racket normal.
Dalam beberapa kasus, Racket memiliki konstruk yang perilakunya menyimpang dari R5RS. Yang paling jelas adalah membuat cons
konstruk pasangan yang tidak dapat diubah ( mcons
membangun pasangan yang bisa berubah-ubah). Satu keuntungan dari memiliki pasangan yang tidak berubah, adalah bahwa length
sekarang berjalan dalam O (1) waktu diamortisasi.
Racket mencakup banyak konstruksi bahasa yang sangat bagus yang tidak termasuk dalam skema R6RS, seperti "cocok" .
match
sangat bagus tapi untungnya itu hanya makro sehingga dapat dengan mudah ditambahkan ke Lisps yang tidak memilikinya. Lisp umum dapat melakukan pencocokan pola cahaya pada daftar melalui destructuring-bind
. Sangat mudah untuk menulis destructuring-case
makro berdasarkan itu, dan banyak orang memilikinya. Untuk Skema ada match
perpustakaan portabel . Clojure punya core.match
.
()
tidak valid, tidak mengevaluasi diri. Juga, Racket memang memiliki batasan lebihletrec
- misalnya, yang ada dalamr5rs
bahasa; ini adalah pilihan yang disengaja untuk menggunakanletrec*
versi -seperti dalam bahasa default.