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:
- Racket tidak memiliki
set-cdr!
dan set-car!
, melainkan set-mcar!
hanya berfungsi pada pasangan yang secara khusus dibuat sebagai dapat diubah.
- Apa panggilan Racket
letrec
disebut letrec*
dalam R6RS dan tidak ada di R5RS, apa panggilan R5RS dan R6RS letrec
tidak ada di Racket.
- Dalam Racket, banyak hal yang mengevaluasi diri sendiri yang akan memunculkan kesalahan pada R5RS, yang
paling penting adalah daftar kosong .
- Racket peka huruf besar / kecil, meskipun R6RS juga peka huruf besar kecil
- Memperlakukan raket
( ... )
dan [ ... ]
setara, R5RS tidak, tetapi R6RS tidak.
Mungkin ada lebih banyak, tetapi pada sebagian besar bagian raket adalah superset dari Skema.
()
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.()
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.
sumber
Dasar pemikiran untuk perubahan nama dari Skema PLT ke Racket dibahas di situs Racket .
sumber
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 bahwalength
sekarang berjalan dalam O (1) waktu diamortisasi.sumber
Racket mencakup banyak konstruksi bahasa yang sangat bagus yang tidak termasuk dalam skema R6RS, seperti "cocok" .
sumber
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 melaluidestructuring-bind
. Sangat mudah untuk menulisdestructuring-case
makro berdasarkan itu, dan banyak orang memilikinya. Untuk Skema adamatch
perpustakaan portabel . Clojure punyacore.match
.Untuk satu contoh besar, daftar Racket tidak dapat diubah secara default sedangkan Skema dapat diubah. Racket juga mencakup banyak pustaka standar (mis. Server Web) yang tidak dimiliki Skema lain.
sumber