Как Ракетка отличается от Схемы?

Ракетка является потомком Схемы. Как Racket отличается от R6RS? Что он добавил или убрал, или просто отличается?

Я понимаю, что Racket - это больше, чем язык, это платформа для языков. Но я имею в виду основной диалект Ракетки.

Ответ 1

Ракетка в конечном счете основана на R5RS, а не на R6RS, а не на строгом дополнении. Я не думаю, что его можно назвать "Схем", потому что он не обратно совместим с любым стандартом Схемы.

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

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

Есть, вероятно, больше, но на большинстве других частей ракетка является надмножеством Схемы.

Ответ 2

Он содержит неизменные списки, как упоминалось выше. Он также содержит структурную систему, которая немного чище, чем система записи R6RS. Он имеет объектно-ориентированную систему классов и объектов. Он имеет встроенную поддержку дизайна по контракту. Он имеет единую систему, напоминающую модульную систему ML, а также модульную систему, подобную системе модулей R6RS. Я уверен, что забыл так много вещей, как я уже упоминал.

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

Ответ 3

Обоснование изменения имени с PLT Scheme на Racket обсуждается на сайте Racket.

Ответ 4

Racket включает в себя множество действительно хороших языковых конструкций, не включенных в схему R6RS, например "match" .

Ответ 5

Спецификация языка R5RS на языке программирования Схемы основана на консенсусе между несколькими разработчиками Схемы. Это означает, что язык очень стабилен. Это также означает, что многие полезные функции не являются частью стандарта R5RS.

Ракетка построена на R5RS и значительно расширила ее. Некоторые расширения определяются как макросы, но некоторые функции требуют поддержки системы времени выполнения.

Особенности в Racket не реализуются только макросами:

  • разграниченные продолжения (более общие, чем call/cc)
  • знаки продолжения
  • темы
  • места
  • FFI

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

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

Ответ 6

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