2010-07-27 18 views
145

Raqueta es un descendiente de Scheme. ¿En qué se diferencia la raqueta de la R6RS? ¿Qué agregó, quitó o simplemente es diferente?¿En qué se diferencia la raqueta de Scheme?

Entiendo que Racket es más que un lenguaje, es una plataforma para idiomas. Pero me refiero al dialecto principal de la Raqueta.

Respuesta

107

La raqueta se basa en última instancia en R5RS, y no en R6RS y tampoco en un superconjunto estricto de cualquiera. No creo que se pueda llamar 'Esquema' porque no es compatible con ningún estándar del Esquema.

La mayoría de las implementaciones ofrecen extensiones, pero son compatibles con versiones anteriores, por supuesto, el compilador que viene con Racket también puede ejecutarse en modo R5RS o R6RS. El esquema R5/6RS válido que se ejecuta en modo de raqueta puede ser rechazado, causar errores de tiempo de ejecución o comportarse de forma diferente de lo que debería. Dicho esto, los principales puntos donde no es compatible con versiones anteriores son:

  • raqueta no tiene set-cdr! y set-car!, en lugar set-mcar! que sólo funciona en pares creados específicamente como mutable.
  • Lo que se llama Racket letrec se llama letrec* en R6RS y no existe en R5RS, lo que R5RS y R6RS llaman letrec no existe en Racket.
  • En Racket, hay muchas cosas que se autoevalúan, lo que generaría un error en R5RS, y, lo que es más importante, en la lista vacía.
  • Raqueta de mayúsculas y minúsculas, aunque R6RS también es sensible a mayúsculas
  • Raqueta trata (...) y [ ... ] como equivalente, R5RS no, pero R6RS hace.

Probablemente haya más, pero en la mayoría de las otras partes, la raqueta es un superconjunto de Scheme.

+20

En Racket '()' no es válido, no es de autoevaluación. Además, Racket * does * tiene el 'letrec' más restringido, por ejemplo, el que está en el lenguaje' r5rs'; es una elección intencional utilizar la versión de tipo 'letrec *' en el idioma predeterminado. –

+8

@ Eli, whoops, tienes razón, la raqueta que se ejecuta en modo Swindle parece considerar '()' autoevaluarse, me confundí con esa. Nunca entendí por qué '()' no se autoevaluó en Scheme como en Common Lisp. – Zorf

+0

@Zorf Se puede cambiar fácilmente al sobrecargar '#% app', aunque:' #lang racket (require (rename-in racket [#% app old])) (define-sintaxis #% app (sintaxis-rules() [(_) '()] [(_. rest) (old. rest)])) (null?()) ;; => # t' –

9

Para un gran ejemplo, las listas de Racket son inmutables por defecto, mientras que las de Scheme son mutables. Racket también incluye muchas bibliotecas estándar (por ejemplo, servidor web) que otros esquemas no tienen.

29

Contiene listas inmutables, como se mencionó anteriormente. También contiene un sistema de estructura que es un poco más limpio que el sistema de registro R6RS. Tiene una clase orientada a objetos y un sistema de objetos. Tiene soporte nativo para diseño por contrato. Tiene un sistema de unidad que recuerda al sistema de módulos ML, así como un sistema de módulos muy parecido al sistema de módulos R6RS. Estoy seguro de haber olvidado todas las cosas que he mencionado.

No estoy seguro de que el cambio de nombre sea útil como algo más que un truco de marketing, pero la raqueta es definitivamente un dialecto distinto de esquema.

+17

Creo que el cambio de nombre se debió a que no querían ser un dialecto de Scheme con un montón de adiciones no estándar; querían ser un lenguaje basado en Scheme con muchas más cosas. Clasificar el esquema PLT como "solo" un dialecto de Scheme es como clasificar a Ruby como un dialecto de Mirah, no es inexacto, pero minimiza las fortalezas del idioma. – Chuck

+4

Creo que usar un nombre diferente es una decisión sabia: usar el mismo nombre para diferentes idiomas que tienen un origen común es IMO confuso. Cambiaría el nombre incluso si el lenguaje contenía Scheme como un subconjunto, pero contenía tantas adiciones que alentaría un estilo de programación muy diferente. – Giorgio

18

Se discute el motivo para el cambio de nombre de PLT Scheme a Racket on the Racket site.

12

La raqueta incluye muchas construcciones de lenguaje realmente agradables no incluidas en el esquema R6RS, como "match".

+0

¿Por qué "combinar" sería una buena característica? Al menos, cuando exprese una opinión, debe dar una breve explicación de la misma, para que las personas que no están familiarizadas con Racket puedan entender por qué el "partido" es teóricamente beneficioso. – nbro

+0

La coincidencia de patrones es una característica realmente deseada en muchos idiomas con fondos de programación funcional, desafortunadamente ni siquiera R6RS o Common Lisp implementa esto de forma predeterminada, así que sí, esta es una función realmente agradable y diferencial que ofrece Racket. Por ejemplo, idiomas como Haskell, Elixir, Rust y F # proporcionan ese tipo de construcciones y son muy utilizados. Personalmente hago la programación de Lisp principalmente en Common Lisp y extraño en muchos casos la falta de implementación de coincidencia de patrones. –

11

La especificación de idioma R5RS en el lenguaje de programación Scheme se basa en el consenso entre los múltiples implementadores de Scheme. Esto implica que el lenguaje es muy estable. También implica que muchas características útiles no son parte del estándar R5RS.

La raqueta se ha basado en R5RS y la ha ampliado considerablemente. Algunas extensiones se definen como macros, pero algunas funciones requieren el soporte del sistema de tiempo de ejecución.

Características de la raqueta no implementables mediante macros por sí solos:

  • continuaciones delimitados (más generales que la llamada/cc)
  • marcas continuación
  • hilos
  • lugares
  • FFI

El módulo y el sistema de macros son mucho más general que la especificación RnRS. Junto con #lang especificación de lector/lenguaje hace posible definir idiomas personalizados (con sintaxis personalizada) y usarlos con programas Racket normales.

En algunos casos Racket tiene construcciones cuyo comportamiento se desvía de R5RS. El más obvio es hacer cons construir un par inmutable (mcons construye un par mutable). Una ventaja de tener pares inmutables es que length ahora se ejecuta en O (1) tiempo amortizado.

+0

... pero hace que la lista de O (1) sea imposible. –