Respostas:
A raquete é basicamente baseada no R5RS, e não no R6RS e nem em um superconjunto estrito de nenhum deles. Eu não acho que possa ser chamado de 'esquema' porque não é compatível com nenhum padrão de esquema.
A maioria das implementações oferece extensões, mas de outra forma é compatível com versões anteriores, é claro, o compilador que acompanha o Racket também pode ser executado no modo R5RS ou R6RS. O esquema R5 / 6RS válido que é executado no modo de raquete pode ser rejeitado, causar erros de tempo de execução ou se comportar de maneira diferente do que deveria. Dito isto, os principais pontos em que não é compatível com versões anteriores são:
set-cdr!
e set-car!
, em vez set-mcar!
disso, funciona apenas em pares criados especificamente como mutáveis.letrec
é chamado letrec*
no R6RS e não existe no R5RS, o que o R5RS e o R6RS chama letrec
não existe no Racket.( ... )
e, [ ... ]
como equivalente, o R5RS não, mas o R6RS o faz.Provavelmente há mais, mas na maioria das outras peças a raquete é um superconjunto do esquema.
()
auto-avaliação, fiquei confuso com isso. Eu realmente nunca entendi porque ()
não estava se autoavaliando no Scheme, como no Common Lisp.
#%app
:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Ele contém listas imutáveis, como mencionado acima. Ele também contém um sistema de estrutura um pouco mais limpo que o sistema de registro R6RS. Possui uma classe orientada a objetos e um sistema de objetos. Possui suporte nativo para design por contrato. Possui um sistema de unidades remanescente do sistema de módulos ML, bem como um sistema de módulos muito parecido com o sistema de módulos R6RS. Tenho certeza que esqueci tantas coisas quanto mencionei.
Não tenho certeza de que a renomeação tenha sido útil como algo que não seja um truque de marketing, mas a raquete é definitivamente um dialeto distinto do esquema.
A lógica para a mudança de nome do esquema PLT para Racket é discutida no site do Racket .
A especificação de linguagem R5RS na linguagem de programação Scheme é baseada no consenso entre os vários implementadores do Scheme. Isso implica que a linguagem é muito estável. Isso também implica que muitos recursos úteis não fazem parte do padrão R5RS.
A raquete foi desenvolvida com base no R5RS e o estendeu bastante. Algumas extensões são definidas como macros, mas alguns recursos requerem o suporte do sistema de tempo de execução.
Recursos no Racket não implementáveis apenas por macros:
O módulo e o sistema macro são muito mais gerais que a especificação RnRS. Juntamente com a #lang
especificação do leitor / idioma, é possível definir idiomas personalizados (com sintaxe personalizada) e usá-los com programas Racket normais.
Em alguns casos, o Racket possui construções cujo comportamento se desvia do R5RS. O mais óbvio é fazer da cons
construção um par imutável ( mcons
constrói um par mutável). Uma vantagem de ter pares imutáveis é que length
agora é executado em O (1) tempo amortizado.
O raquete inclui muitas construções de linguagem realmente agradáveis, não incluídas no esquema R6RS, como "match" .
match
é muito bom, mas felizmente é apenas uma macro para que possa ser facilmente adicionada ao Lisps que não a possui. O Lisp comum pode fazer a correspondência de padrões de luz nas listas via destructuring-bind
. É simples escrever uma destructuring-case
macro com base nela, e muitas pessoas têm. Para o esquema, existem match
bibliotecas portáteis . Clojure tem core.match
.
()
é inválido, não é autoavaliado. Além disso, Racket faz ter mais restritaletrec
- por exemplo, a dar5rs
linguagem; é uma escolha intencional usar aletrec*
versão-like no idioma padrão.