Чим Ракетка відрізняється від схеми?


184

Ракетка - нащадок Схеми. Чим Racket відрізняється від R6RS? Що це додало, чи забрало, чи просто різне?

Я розумію, що Ракетка - це більше, ніж мова, це платформа для мов. Але я маю на увазі основний діалект Ракетки.

Відповіді:


132

Зрештою, ракетка базується на R5RS, а не на R6RS і не є суворим набором. Я не думаю, що її можна назвати "Схема", оскільки вона не сумісна з будь-яким стандартом схеми.

Більшість реалізацій пропонують розширення, але в іншому випадку вони сумісні з зворотним ходом, звичайно, компілятор, який постачається разом з Racket, також може працювати в режимі R5RS або R6RS. Дійсна схема R5 / 6RS, що працює в ракетному режимі, може бути відхилена, викликати помилки під час виконання або поводитись інакше, ніж слід. З урахуванням сказаного, основні моменти, коли це не сумісне із зворотним боком, є:

  • У ракетки немає set-cdr!і set-car!, швидше, set-mcar!яка працює лише на парах, створених як мутабельні.
  • Що Ракетка називає letrecназивається letrec*в R6RS і не існує в R5RS, які R5 і R6RS виклик letrecне існує в рекеті.
  • У Ракетці багато речей самооцінюється, що може призвести до помилки в R5RS, головне - порожній список .
  • Ракетка залежить від регістру, хоча R6RS також відрізняється від регістру
  • Ракетка трактує ( ... )і, [ ... ]як рівноцінне, R5RS не робить, але R6RS це робить.

Напевно, їх більше, але для більшості інших частин ракетка є суперсетью схеми.


24
У ракетці ()недійсний, не оцінює себе. Крім того , Ракетка робить ще більш обмежений letrec- наприклад, один в r5rsмові; це навмисний вибір використання такої letrec*версії мовою за замовчуванням.
Елі Барзілай

9
@ Елі, ну, ти маєш рацію, ракетка, що працює в режимі "Шахрайство", здається, вважає ()себе самооцінкою, я з цим переплутався. Я ніколи насправді не зрозумів, чому ()не був самооцінюваним у Scheme, як це є у Common Lisp, хоча.
Zorf

@Zorf Це легко змінити, перевантажуючи #%app, хоча:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Сюзанна Дуперон

2
Цю відповідь слід оновити. Набір функцій ракетки значно перевершує схему тепер, з модулями та мовними визначеннями тощо
CinchBlue

1
@MaliRemorker Я не розумію, що саме ти маєш на увазі, але схема наразі на R7RS і була на R6RS. Але Ракет все-таки перевищує набір функцій R6RS.
CinchBlue

36

Він містить незмінні списки, як згадувалося вище. Він також містить структурну систему, яка трохи чистіша, ніж система запису R6RS. Він має об'єктно-орієнтований клас та об’єктну систему. Він має підтримку дизайну за контрактом. Він має модульну систему, що нагадує систему модулів ML, а також модульну систему, подібно до модульної системи R6RS. Я впевнений, що забув стільки речей, скільки згадував.

Я не впевнений, що перейменування було корисним як будь-що, крім маркетингового трюку, але ракетка - це безумовно чіткий діалект схеми.


24
Я думаю, що перейменування було через те, що вони не хотіли бути якоюсь діалектною схемою з купою нестандартних доповнень - вони хотіли бути мовою, що базується на схемі, зі стандартом ще багато матеріалів. Класифікація PLT-схеми як "просто" діалект схеми - це як класифікація Рубі як діалект Міри - це неточно, але це неначе применшує сильні сторони мови.
Чак

5
Я думаю, що використання іншого імені є розумним рішенням: використання одного і того ж імені для різних мов, які мають спільне походження, IMO заплутане. Я б змінив ім'я, навіть якби мова містила схему як підмножину, але містила стільки доповнень, що це заохочувало б зовсім інший стиль програмування.
Джорджіо


18

Мовна специфікація R5RS для мови програмування Scheme заснована на консенсусі між декількома виконавцями схеми. Це означає, що мова є дуже стійкою. Це також означає, що багато корисних функцій не є частиною стандарту R5RS.

Ракетка побудована на R5RS і значно розширила його. Деякі розширення визначаються як макроси, але деякі функції вимагають підтримки системи виконання.

Особливості в Racket, які не можна реалізувати лише макросами:

  • обмежене продовження (більш загальне, ніж виклик / куб.см)
  • знаки продовження
  • нитки
  • місця
  • ffi

Модуль і макросистема набагато загальніші, ніж специфікація RnRS. Разом із #langспецифікацією читача / мови дає змогу визначати власні мови (із спеціальним синтаксисом) та використовувати їх у звичайних програмах Racket.

У кількох випадках у Racket є конструкції, поведінка яких відхиляється від R5RS. Найбільш очевидним є створення consконструкції незмінної пари ( mconsконструює змінну пару). Однією з переваг наявності непорушних пар є те, що lengthзараз працює в O (1) амортизований час.


2
... але це робить додавання списку O (1) неможливим.
Буде Несс

16

Ракетка включає в себе дуже багато приємних мовних конструкцій, не включених до схеми R6RS, як-от "відповідати" .


3
Чому б "відповідність" була приємною рисою? Принаймні, висловлюючи думку, ви повинні дати її коротке пояснення, щоб люди, які недостатньо добре знайомі з Ракеткою, могли зрозуміти, чому «збіг» теоретично вигідний.
nbro

1
Зіставлення шаблонів - дійсно бажана функція для багатьох мов з функціональним фоном програмування, на жаль, навіть R6RS або Common Lisp не реалізують це за замовчуванням, так що так, це дійсно приємна та диференціальна функція, яку надає Ракетка. Наприклад, такі мови, як Haskell, Elixir, Rust і F #, надають такий тип конструкцій і широко використовуються. Я особисто роблю програмування Lisp в основному в Common Lisp, і я часто пропускаю відсутність реалізації відповідності шаблонів.
Manoel Vilela

1
matchце дуже приємно, але, на щастя, це просто макрос, тому його можна легко додати до Lisps, у яких його немає. Звичайний Lisp може підбирати світлі шаблони у списках через destructuring-bind. Написати destructuring-caseмакрос на його основі просто, і багато людей мають. Для схеми є портативні matchбібліотеки. Clojure має core.match.
Лассі

Макроси можуть зробити код важким для читання, оскільки вони часто мають спеціальну семантику, тому мова повинна завжди стандартизувати всі макроси загального призначення, щоб кожен не створював власні макроси. Зіставлення шаблонів має бути типовим, як у Arc & Clojure & Racket & Ocaml & Haskell, оскільки воно прямо безпосередньо визначає наміри. Caddr - занадто низький рівень.
aoeu256

12

Для одного великого прикладу, списки рекетів за замовчуванням незмінні, тоді як схеми є змінними. Ракетка також включає багато стандартних бібліотек (наприклад, Веб-сервер), яких немає в інших схемах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.