Чем Ракетка отличается от Схемы? - PullRequest
167 голосов
/ 27 июля 2010

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

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

Ответы [ 6 ]

119 голосов
/ 29 июля 2010

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

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

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

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

33 голосов
/ 27 июля 2010

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

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

21 голосов
/ 30 июля 2010

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

17 голосов
/ 19 сентября 2011

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

13 голосов
/ 31 марта 2015

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

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

Функции в Racket, не реализуемые только макросами:

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

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

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

9 голосов
/ 27 июля 2010

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

...