Qual a diferença entre o Racket e o Scheme?

184

Raquete é descendente de Scheme. Qual a diferença entre o Racket e o R6RS? O que foi adicionado, retirado ou apenas diferente?

Entendo que o Racket é mais que um idioma, é uma plataforma para idiomas. Mas estou me referindo ao dialeto principal da raquete.

mudge
fonte

Respostas:

132

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:

  • A raquete não possui set-cdr!e set-car!, em vez set-mcar!disso, funciona apenas em pares criados especificamente como mutáveis.
  • O que o Racket chama letrecé chamado letrec*no R6RS e não existe no R5RS, o que o R5RS e o R6RS chama letrecnão existe no Racket.
  • No Racket, muitas coisas são autoavaliadas, o que geraria um erro no R5RS, principalmente a lista vazia .
  • A raquete faz distinção entre maiúsculas e minúsculas, embora o R6RS também faça distinção entre maiúsculas e minúsculas
  • A raquete trata ( ... )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.

Zorf
fonte
24
Na raquete ()é inválido, não é autoavaliado. Além disso, Racket faz ter mais restrita letrec- por exemplo, a da r5rslinguagem; é uma escolha intencional usar a letrec*versão-like no idioma padrão.
Eli Barzilay
9
@ Eli, opa, você está certo, a raquete rodando no modo Swindle parece considerar ()auto-avaliação, fiquei confuso com isso. Eu realmente nunca entendi porque ()não estava se autoavaliando no Scheme, como no Common Lisp.
Zorf
@Zorf Pode ser facilmente alterado por sobrecarga #%app:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron 22/11
2
Esta resposta deve ser atualizada. Conjunto de recursos da raquete supera Esquema de agora, com módulos e definições de linguagem, etc.
CinchBlue
1
@MaliRemorker Não entendi exatamente o que você quer dizer, mas o Scheme está atualmente no R7RS e no R6RS. Mas o Racket ainda supera o conjunto de recursos do R6RS.
CinchBlue
36

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.

deinst
fonte
24
Eu acho que a renomeação foi porque eles não queriam ser um dialeto do Scheme com muitas adições fora do padrão - eles queriam ser uma linguagem baseada em Scheme com um padrão muito mais variado. Classificar o esquema PLT como "apenas" um dialeto de esquema é como classificar Ruby como um dialeto de Mirah - não é impreciso, mas meio que diminui os pontos fortes do idioma.
Chuck
5
Eu acho que usar um nome diferente é uma decisão sábia: usar o mesmo nome para idiomas diferentes que têm uma origem comum é IMO confuso. Eu mudaria o nome mesmo que a linguagem contivesse Scheme como um subconjunto, mas contivesse tantas adições que encorajassem um estilo de programação muito diferente.
Giorgio
22

A lógica para a mudança de nome do esquema PLT para Racket é discutida no site do Racket .

Norman Gray
fonte
18

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:

  • continuações delimitadas (mais gerais que call / cc)
  • marcas de continuação
  • tópicos
  • lugares
  • ffi

O módulo e o sistema macro são muito mais gerais que a especificação RnRS. Juntamente com a #langespecificaçã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 consconstrução um par imutável ( mconsconstrói um par mutável). Uma vantagem de ter pares imutáveis ​​é que lengthagora é executado em O (1) tempo amortizado.

soegaard
fonte
2
... mas torna impossível anexar a lista O (1).
Will Ness
16

O raquete inclui muitas construções de linguagem realmente agradáveis, não incluídas no esquema R6RS, como "match" .

Gautam
fonte
3
Por que "combinar" seria um recurso interessante? Pelo menos, quando você expressa uma opinião, deve dar uma breve explicação sobre ela, para que as pessoas que não estão familiarizadas com Racket possam entender por que "combinar" é teoricamente benéfico.
Nbro 07/08/19
1
A Correspondência de Padrões é um recurso realmente desejado em muitas linguagens com experiência em programação funcional, infelizmente nem mesmo o R6RS ou o Common Lisp implementam isso por padrão, portanto, sim, esse é um recurso realmente interessante e diferenciado que o Racket fornece. Por exemplo, idiomas como Haskell, Elixir, Rust e F # fornecem esse tipo de construção e são muito usados. Pessoalmente, faço a programação do Lisp principalmente no Common Lisp e sinto falta, em muitos casos, da falta de implementação de correspondência de padrões.
Manoel Vilela
1
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-casemacro com base nela, e muitas pessoas têm. Para o esquema, existem matchbibliotecas portáteis . Clojure tem core.match.
Lassi
As macros podem dificultar a leitura do código, pois geralmente possuem semântica especial; portanto, o idioma deve sempre padronizar todas as macros de uso geral para que todos não construam suas próprias macros. A correspondência de padrões deve ser o padrão, como em Arc & Clojure & Racket & Ocaml & Haskell, pois especifica mais diretamente a intenção. O nível de caddr está muito baixo.
aoeu256 1/10/19
12

Por um grande exemplo, as listas de raquetes são imutáveis ​​por padrão, enquanto as de esquemas são mutáveis. O raquete também inclui muitas bibliotecas padrão (por exemplo, servidor Web) que outros esquemas não.

Mandril
fonte