Ракетка является потомком Схемы. Чем Racket отличается от R6RS? Что это добавило, или убрало, или просто другое?
Я понимаю, что Racket - это больше, чем язык, это платформа для языков. Но я имею в виду основной Ракетский диалект.
Ракетка в конечном счете основана на R5RS, а не на R6RS и не является строгим надмножеством. Я не думаю, что это можно назвать «Схемой», потому что она не имеет обратной совместимости ни с одним стандартом Схемы.
Большинство реализаций предлагают расширения, но в остальном обратно совместимы, конечно, компилятор, который поставляется с Racket, также может работать в режиме R5RS или R6RS. Допустимая схема R5 / 6RS, работающая в режиме ракетки, может быть либо отклонена, либо вызвать ошибки во время выполнения, либо вести себя иначе, чем должна. С учетом сказанного, основные моменты, когда он не является обратно совместимым:
set-cdr!
и set-car!
, скорее, set-mcar!
который работает только на парах, специально созданных как изменяемые.letrec
называется letrec*
в R6RS и не существует в R5RS, какие R5 и R6RS вызов letrec
не существует в рэкете.( ... )
и [ ... ]
как эквивалент, R5RS не делает, но R6RS делает.Есть, вероятно, больше, но на большинстве других частей ракетка является надмножеством Схемы.
()
это недействительно, не самооценка. Кроме того , Ракетка делает еще более ограниченletrec
- например, один вr5rs
языке; это преднамеренный выбор, чтобы использоватьletrec*
версию -подобного на языке по умолчанию.()
себя самооценкой, я был смущен этим. Я так и не понял, почему()
в Схеме не было самооценки, как в Common Lisp.#%app
, хотя:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Он содержит неизменяемые списки, как указано выше. Он также содержит систему структур, которая немного чище, чем система записей R6RS. Он имеет объектно-ориентированный класс и объектную систему. Он имеет встроенную поддержку дизайна по контракту. Он имеет систему единиц, напоминающую модульную систему ML, а также систему модулей, аналогичную модульной системе R6RS. Я уверен, что забыл столько вещей, сколько упомянул.
Я не уверен, что переименование было полезным как что-либо кроме маркетингового трюка, но ракетка определенно является отличным диалектом схемы.
источник
Обоснование для смены имени с PLT Scheme на Racket обсуждается на сайте Racket .
источник
Спецификация языка R5RS для языка программирования Scheme основана на консенсусе между несколькими разработчиками Scheme. Это подразумевает, что язык очень стабилен. Это также означает, что многие полезные функции не являются частью стандарта R5RS.
Ракетка построена на R5RS и значительно расширила его. Некоторые расширения определены как макросы, но некоторые функции требуют поддержки системы времени выполнения.
Особенности в Racket, не реализуемые только макросами:
Модуль и система макросов являются гораздо более общими, чем спецификация RnRS. Вместе со
#lang
спецификацией читателя / языка позволяет определять пользовательские языки (с пользовательским синтаксисом) и использовать их с обычными программами Racket.В некоторых случаях Racket имеет конструкции, поведение которых отличается от R5RS. Наиболее очевидным является создание
cons
неизменной пары (mcons
создание изменяемой пары). Одним из преимуществ наличия неизменных пар является то, чтоlength
теперь выполняется за время амортизации O (1).источник
Racket включает в себя множество действительно хороших языковых конструкций, не включенных в схему R6RS, таких как «match» .
источник
match
это очень хорошо, но, к счастью, это просто макрос, поэтому его можно легко добавить в Лисп, у которого его нет. Common Lisp может выполнять легкое сопоставление с образцом в списках черезdestructuring-bind
. Это просто написатьdestructuring-case
макрос на основе этого, и многие люди имеют. Для Схемы есть переносимыеmatch
библиотеки. Clojure имеетcore.match
.Для одного большого примера списки Racket являются неизменяемыми по умолчанию, тогда как Scheme являются изменяемыми. Ракетка также включает в себя множество стандартных библиотек (например, веб-сервер), которых нет в других схемах.
источник