Ответы:
Ракетка в конечном счете основана на R5RS, а не на R6RS и не является строгим надмножеством. Я не думаю, что это можно назвать «Схемой», потому что она не имеет обратной совместимости ни с одним стандартом Схемы.
Большинство реализаций предлагают расширения, но в остальном обратно совместимы, конечно, компилятор, который поставляется с Racket, также может работать в режиме R5RS или R6RS. Допустимая схема R5 / 6RS, работающая в режиме ракетки, может быть либо отклонена, либо вызвать ошибки во время выполнения, либо вести себя иначе, чем должна. С учетом сказанного, основные моменты, когда он не является обратно совместимым:
set-cdr!
и set-car!
, скорее, set-mcar!
который работает только на парах, специально созданных как изменяемые.letrec
называется letrec*
в R6RS и не существует в R5RS, какие R5 и R6RS вызов letrec
не существует в рэкете.( ... )
и [ ... ]
как эквивалент, R5RS не делает, но R6RS делает.Есть, вероятно, больше, но на большинстве других частей ракетка является надмножеством Схемы.
()
себя самооценкой, я был смущен этим. Я так и не понял, почему ()
в Схеме не было самооценки, как в 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
.
()
это недействительно, не самооценка. Кроме того , Ракетка делает еще более ограниченletrec
- например, один вr5rs
языке; это преднамеренный выбор, чтобы использоватьletrec*
версию -подобного на языке по умолчанию.