Відповіді:
Зрештою, ракетка базується на 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*
версії мовою за замовчуванням.