Відповіді:
Зрештою, ракетка базується на R5RS, а не на R6RS і не є суворим набором. Я не думаю, що її можна назвати "Схема", оскільки вона не сумісна з будь-яким стандартом схеми.
Більшість реалізацій пропонують розширення, але в іншому випадку вони сумісні з зворотним ходом, звичайно, компілятор, який постачається разом з Racket, також може працювати в режимі R5RS або R6RS. Дійсна схема R5 / 6RS, що працює в ракетному режимі, може бути відхилена, викликати помилки під час виконання або поводитись інакше, ніж слід. З урахуванням сказаного, основні моменти, коли це не сумісне із зворотним боком, є:
set-cdr!і set-car!, швидше, set-mcar!яка працює лише на парах, створених як мутабельні.letrecназивається letrec*в R6RS і не існує в R5RS, які R5 і R6RS виклик letrecне існує в рекеті.( ... )і, [ ... ]як рівноцінне, R5RS не робить, але R6RS це робить.Напевно, їх більше, але для більшості інших частин ракетка є суперсетью схеми.
()себе самооцінкою, я з цим переплутався. Я ніколи насправді не зрозумів, чому ()не був самооцінюваним у Scheme, як це є у Common Lisp, хоча.
#%app, хоча:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Він містить незмінні списки, як згадувалося вище. Він також містить структурну систему, яка трохи чистіша, ніж система запису R6RS. Він має об'єктно-орієнтований клас та об’єктну систему. Він має підтримку дизайну за контрактом. Він має модульну систему, що нагадує систему модулів ML, а також модульну систему, подібно до модульної системи R6RS. Я впевнений, що забув стільки речей, скільки згадував.
Я не впевнений, що перейменування було корисним як будь-що, крім маркетингового трюку, але ракетка - це безумовно чіткий діалект схеми.
Обґрунтування зміни імені з PLT Scheme на Racket обговорюється на сайті Racket .
Мовна специфікація R5RS для мови програмування Scheme заснована на консенсусі між декількома виконавцями схеми. Це означає, що мова є дуже стійкою. Це також означає, що багато корисних функцій не є частиною стандарту R5RS.
Ракетка побудована на R5RS і значно розширила його. Деякі розширення визначаються як макроси, але деякі функції вимагають підтримки системи виконання.
Особливості в Racket, які не можна реалізувати лише макросами:
Модуль і макросистема набагато загальніші, ніж специфікація RnRS. Разом із #langспецифікацією читача / мови дає змогу визначати власні мови (із спеціальним синтаксисом) та використовувати їх у звичайних програмах Racket.
У кількох випадках у Racket є конструкції, поведінка яких відхиляється від R5RS. Найбільш очевидним є створення consконструкції незмінної пари ( mconsконструює змінну пару). Однією з переваг наявності непорушних пар є те, що lengthзараз працює в O (1) амортизований час.
Ракетка включає в себе дуже багато приємних мовних конструкцій, не включених до схеми R6RS, як-от "відповідати" .
matchце дуже приємно, але, на щастя, це просто макрос, тому його можна легко додати до Lisps, у яких його немає. Звичайний Lisp може підбирати світлі шаблони у списках через destructuring-bind. Написати destructuring-caseмакрос на його основі просто, і багато людей мають. Для схеми є портативні matchбібліотеки. Clojure має core.match.
()недійсний, не оцінює себе. Крім того , Ракетка робить ще більш обмеженийletrec- наприклад, один вr5rsмові; це навмисний вибір використання такоїletrec*версії мовою за замовчуванням.