it-swarm.com.ru

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

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

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

165
mudge

Ракетка в конечном счете основана на 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, самое главное пустой список,.
  • Ракетка чувствительна к регистру, хотя R6RS также чувствительна к регистру
  • Racket рассматривает ( ... ) и [ ... ] как эквивалентные, R5RS - нет, а R6RS - нет.

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

118
Zorf

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

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

32
deinst

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

20
Norman Gray

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

17
Gautam

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

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

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

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

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

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

13
soegaard

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

9
Chuck