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

184

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

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

Мадж
источник

Ответы:

132

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

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

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

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

Zorf
источник
24
В Ракетке ()это недействительно, не самооценка. Кроме того , Ракетка делает еще более ограничен letrec- например, один в r5rsязыке; это преднамеренный выбор, чтобы использовать letrec*версию -подобного на языке по умолчанию.
Эли Барзилай
9
@ Элай, ой, ты прав, ракетка, работающая в режиме мошенничества, похоже, считает ()себя самооценкой, я был смущен этим. Я так и не понял, почему ()в Схеме не было самооценки, как в Common Lisp.
Zorf
@Zorf Это может быть легко изменено перегрузкой #%app, хотя:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Сюзанна Дюперон
2
Этот ответ должен быть обновлен. Набор функций Racket намного превосходит возможности Scheme с модулями, определениями языков и т. Д.
CinchBlue
1
@MaliRemorker Я не совсем понимаю, что вы имеете в виду, но Схема в настоящее время работает на R7RS и была на R6RS. Но Racket по-прежнему превосходит набор функций R6RS.
CinchBlue
36

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

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

deinst
источник
24
Я думаю, что переименование произошло потому, что они не хотели быть каким-то диалектом Scheme с кучей нестандартных дополнений - они хотели быть языком на основе Scheme с большим количеством стандартного материала. Классификация PLT Scheme как «просто» диалекта Scheme - это то же самое, что классифицировать Ruby как диалект Mirah - это не является неточным, но в некотором роде преуменьшает сильные стороны языка.
Чак
5
Я думаю, что использование другого имени является мудрым решением: использование одного и того же имени для разных языков, имеющих общее происхождение, сбивает с толку IMO. Я бы поменял имя, даже если бы язык содержал Scheme как подмножество, но содержал так много дополнений, что это способствовало бы совершенно другому стилю программирования.
Джорджио
18

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

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

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

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

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

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

soegaard
источник
2
... но это делает невозможным добавление списка O (1).
Уилл Несс
16

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

Гаутама
источник
3
Почему «матч» будет хорошей особенностью? По крайней мере, когда вы выражаете мнение, вы должны дать ему краткое объяснение, чтобы люди, плохо знакомые с Racket, могли понять, почему «совпадение» теоретически полезно.
17
1
Сопоставление с образцом является действительно желательной функцией во многих языках с функциональным фоном программирования, к сожалению, даже в R6RS или Common Lisp это не реализовано по умолчанию, так что да, это действительно хорошая и отличительная функция, которую предоставляет Racket. Например, такие языки, как Haskell, Elixir, Rust и F #, предоставляют конструкции такого типа и активно используются. Я лично занимаюсь программированием на Лиспе в основном на Common Lisp, и во многих случаях я скучаю по отсутствию реализации сопоставления с образцом.
Маноэль Вилела
1
matchэто очень хорошо, но, к счастью, это просто макрос, поэтому его можно легко добавить в Лисп, у которого его нет. Common Lisp может выполнять легкое сопоставление с образцом в списках через destructuring-bind. Это просто написать destructuring-caseмакрос на основе этого, и многие люди имеют. Для Схемы есть переносимые matchбиблиотеки. Clojure имеет core.match.
Ласси
Макросы могут затруднить чтение кода, поскольку они часто имеют особую семантику, поэтому язык должен всегда стандартизировать все макросы общего назначения, чтобы каждый не создавал свои собственные макросы. Сопоставление с образцом должно быть по умолчанию, как в Arc & Clojure & Racket & Ocaml & Haskell, поскольку оно более точно определяет намерение. Caddr слишком низкий уровень.
aoeu256
12

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

цыпленок
источник