Bagaimana Racket berbeda dari Skema?

184

Racket adalah keturunan Skema. Bagaimana Racket berbeda dari R6RS? Apa yang ditambahkan, atau dihapus, atau hanya berbeda?

Saya mengerti bahwa Racket lebih dari sekedar bahasa, ini adalah platform untuk bahasa. Tapi saya mengacu pada dialek Racket utama.

lumpur
sumber

Jawaban:

132

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 letrecdisebut letrec*dalam R6RS dan tidak ada di R5RS, apa panggilan R5RS dan R6RS letrectidak 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.

Zorf
sumber
24
Di Racket ()tidak valid, tidak mengevaluasi diri. Juga, Racket memang memiliki batasan lebih letrec- misalnya, yang ada dalam r5rsbahasa; ini adalah pilihan yang disengaja untuk menggunakan letrec*versi -seperti dalam bahasa default.
Eli Barzilay
9
@ Eli, wah, kau benar, raket yang berjalan dalam mode Swindle tampaknya mempertimbangkan ()evaluasi diri, aku bingung dengan yang itu. Saya tidak pernah benar-benar mengerti mengapa ()tidak mengevaluasi diri dalam Skema seperti pada Common Lisp.
Zorf
@ Zorf Dapat dengan mudah diubah dengan kelebihan beban #%app, meskipun:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron
2
Jawaban ini harus diperbarui. Set fitur Racket jauh melebihi Skeme sekarang, dengan modul dan definisi bahasa, dll.
CinchBlue
1
@MaliRemorker Saya tidak mengerti apa yang Anda maksud, tetapi Skema saat ini di R7RS dan berada di R6RS. Tapi Racket masih mengungguli set fitur R6RS.
CinchBlue
36

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.

Deinst
sumber
24
Saya pikir penggantian nama itu karena mereka tidak ingin menjadi dialek Skema dengan banyak penambahan yang tidak standar - mereka ingin menjadi bahasa berbasis Skema dengan banyak standar barang lainnya. Mengklasifikasikan Skema PLT sebagai "hanya" dialek Skema seperti mengklasifikasikan Ruby sebagai dialek Mirah - itu tidak akurat, tetapi agak meremehkan kekuatan bahasa.
Chuck
5
Saya pikir menggunakan nama yang berbeda adalah keputusan yang bijaksana: menggunakan nama yang sama untuk bahasa yang berbeda yang memiliki asal yang sama adalah membingungkan IMO. Saya akan mengubah nama walaupun bahasanya mengandung Skema sebagai himpunan bagian tetapi mengandung begitu banyak tambahan yang akan mendorong gaya pemrograman yang sangat berbeda.
Giorgio
22

Dasar pemikiran untuk perubahan nama dari Skema PLT ke Racket dibahas di situs Racket .

Norman Gray
sumber
18

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:

  • kelanjutan yang dibatasi (lebih umum dari panggilan / cc)
  • tanda kelanjutan
  • utas
  • tempat
  • ffi

Modul dan sistem makro jauh lebih umum daripada spesifikasi RnRS. Bersama dengan #langspesifikasi 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 conskonstruk pasangan yang tidak dapat diubah ( mconsmembangun pasangan yang bisa berubah-ubah). Satu keuntungan dari memiliki pasangan yang tidak berubah, adalah bahwa lengthsekarang berjalan dalam O (1) waktu diamortisasi.

soegaard
sumber
2
... tapi itu membuat O (1) daftar tambahkan tidak mungkin.
Will Ness
16

Racket mencakup banyak konstruksi bahasa yang sangat bagus yang tidak termasuk dalam skema R6RS, seperti "cocok" .

Gautam
sumber
3
Mengapa "cocok" menjadi fitur yang bagus? Setidaknya, ketika Anda menyatakan pendapat, Anda harus memberikan penjelasan singkat tentangnya, sehingga orang yang tidak terbiasa dengan Racket dapat memahami mengapa "kecocokan" secara teori bermanfaat.
nbro
1
Pencocokan Pola adalah fitur yang sangat diinginkan pada banyak bahasa dengan latar belakang pemrograman fungsional, sayangnya bahkan R6RS atau Common Lisp tidak mengimplementasikan ini secara default, jadi ya ini adalah fitur yang sangat bagus dan diferensial yang disediakan Racket. Misalnya bahasa seperti Haskell, Elixir, Rust dan F # menyediakan jenis konstruksi dan banyak digunakan. Saya pribadi membuat pemrograman Lisp sebagian besar dalam Common Lisp dan saya kehilangan dalam banyak kasus kurangnya implementasi pencocokan pola.
Manoel Vilela
1
matchsangat 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-casemakro berdasarkan itu, dan banyak orang memilikinya. Untuk Skema ada matchperpustakaan portabel . Clojure punya core.match.
Lassi
Makro dapat membuat kode sulit dibaca karena mereka sering memiliki semantik khusus, oleh karena itu bahasa harus selalu membakukan semua makro tujuan umum sehingga semua orang tidak membangun makro mereka sendiri. Pencocokan pola harus default seperti di Arc & Clojure & Racket & Ocaml & Haskell karena lebih langsung menentukan niat. Caddr terlalu rendah.
aoeu256
12

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.

Membuang
sumber