Ракетка является потомком Схемы. Как Racket отличается от R6RS? Что он добавил или убрал, или просто отличается?
Я понимаю, что Racket - это больше, чем язык, это платформа для языков. Но я имею в виду основной диалект Ракетки.
Ракетка является потомком Схемы. Как Racket отличается от R6RS? Что он добавил или убрал, или просто отличается?
Я понимаю, что Racket - это больше, чем язык, это платформа для языков. Но я имею в виду основной диалект Ракетки.
Ракетка в конечном счете основана на R5RS, а не на R6RS, а не на строгом дополнении. Я не думаю, что его можно назвать "Схем", потому что он не обратно совместим с любым стандартом Схемы.
Большинство реализаций предлагают расширения, но, наоборот, совместимы с обратной связью, конечно, компилятор, который поставляется с Racket, также может работать в режиме R5RS или R6RS. Действительная схема R5/6RS, которая работает в режиме ракетки, может быть либо отклонена, либо вызвана ошибками во время выполнения, либо будет вести себя иначе, чем должна. С учетом сказанного, основные моменты, в которых он не совместим с обратной стороной:
set-cdr!
и set-car!
, а set-mcar!
, который работает только на пары, специально созданные как изменяемые.letrec
, называется letrec*
в R6RS и не существует в R5RS, то, что R5RS и R6RS вызывает letrec
, не существует в Racket.( ... )
и [ ... ]
как эквивалент, R5RS не делает, но R6RS делает.Есть, вероятно, больше, но на большинстве других частей ракетка является надмножеством Схемы.
Он содержит неизменные списки, как упоминалось выше. Он также содержит структурную систему, которая немного чище, чем система записи R6RS. Он имеет объектно-ориентированную систему классов и объектов. Он имеет встроенную поддержку дизайна по контракту. Он имеет единую систему, напоминающую модульную систему ML, а также модульную систему, подобную системе модулей R6RS. Я уверен, что забыл так много вещей, как я уже упоминал.
Я не уверен, что переименование было полезным не что иное, как маркетинговый трюк, но рэкет определенно является отдельным диалектом схемы.
Обоснование изменения имени с PLT Scheme на Racket обсуждается на сайте Racket.
Racket включает в себя множество действительно хороших языковых конструкций, не включенных в схему R6RS, например "match" .
Спецификация языка R5RS на языке программирования Схемы основана на консенсусе между несколькими разработчиками Схемы. Это означает, что язык очень стабилен. Это также означает, что многие полезные функции не являются частью стандарта R5RS.
Ракетка построена на R5RS и значительно расширила ее. Некоторые расширения определяются как макросы, но некоторые функции требуют поддержки системы времени выполнения.
Особенности в Racket не реализуются только макросами:
Модуль и макросистема гораздо более общие, чем спецификация RnRS.
Вместе со спецификацией чтения/языка #lang
можно определить пользовательские языки (с помощью специального синтаксиса) и использовать их с обычными программами Racket.
В некоторых случаях Racket имеет конструкции, поведение которых отклоняется от R5RS. Наиболее очевидным является создание cons
конструкции неизменяемой пары (mcons
создает изменчивую пару). Одно из преимуществ наличия неизменяемых пар состоит в том, что length
теперь работает в O (1) амортизированном времени.
Для одного большого примера списки Racket неизменяемы по умолчанию, тогда как Scheme являются изменяемыми. Ракетка также включает в себя множество стандартных библиотек (например, веб-сервер), которых нет в других схемах.