Racket se basa en última instancia en R5RS, y no en R6RS y no en un estricto superconjunto de ninguno de los dos. No creo que se pueda llamar 'Esquema' porque no es compatible con cualquier estándar de Esquema.
La mayoría de las implementaciones ofrecen extensiones, pero por lo demás 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 raqueta puede ser rechazado, causar errores de tiempo de ejecución o comportarse de manera diferente de lo que debería. Dicho esto, los puntos principales donde no es compatible con versiones anteriores son:
- Racket tiene no
set-cdr!
y set-car!
, más bien, set-mcar!
que solo funciona en pares creados específicamente como mutables.
- Lo que Racket llama
letrec
se llama letrec*
en R6RS y no existe en R5RS, lo que R5RS y R6RS llaman letrec
no existe en Racket.
- En Racket, muchas cosas se autoevalúan, lo que generaría un error en R5RS, lo
más importante, la lista vacía .
- La raqueta distingue entre mayúsculas y minúsculas, aunque R6RS también distingue entre mayúsculas y minúsculas
- La raqueta trata
( ... )
y, [ ... ]
como equivalente, R5RS no, pero R6RS sí.
Probablemente haya más, pero en la mayoría de las otras partes, la raqueta es un superconjunto de Scheme.
()
no es válido, no se autoevalúa. Además, la raqueta hace haber más restringidoletrec
- por ejemplo, el de lar5rs
lengua; Es una elección intencional utilizar laletrec*
versión similar en el idioma predeterminado.()
autoevaluarse, estaba confundido con ese. Sin()
embargo, nunca entendí por qué no estaba autoevaluando en Scheme como lo es en Common Lisp#%app
:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
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 el diseño por contrato. Tiene un sistema de unidades que recuerda al sistema de módulos ML, así como un sistema de módulos muy similar al sistema de módulos R6RS. Estoy seguro de que he olvidado tantas cosas como he mencionado.
No estoy seguro de que el cambio de nombre fuera útil como algo más que un truco de marketing, pero la raqueta es definitivamente un dialecto distinto del esquema.
fuente
La justificación del cambio de nombre del Esquema PLT a Racket se discute en el sitio Racket .
fuente
La especificación del lenguaje R5RS en el lenguaje de programación Scheme se basa en el consenso entre los múltiples implementadores del Scheme. Esto implica que el lenguaje es muy estable. También implica que muchas características útiles no son parte del estándar R5RS.
Racket se ha basado en R5RS y lo ha ampliado enormemente. Algunas extensiones se definen como macros, pero algunas características requieren el soporte del sistema de tiempo de ejecución.
Características en Racket no implementables solo por macros:
El módulo y el sistema macro son mucho más generales que la especificación RnRS. Junto con la
#lang
especificación de lector / idioma, es posible definir idiomas personalizados (con sintaxis personalizada) y usarlos con programas normales de Racket.En algunos casos, Racket tiene construcciones cuyo comportamiento se desvía de R5RS. La más obvia es hacer que
cons
construir un par inmutable (mcons
construya un par mutable). Una ventaja de tener pares inmutables es quelength
ahora se ejecuta en O (1) tiempo amortizado.fuente
Racket incluye muchas construcciones de lenguaje realmente agradables no incluidas en el esquema R6RS, como "match" .
fuente
match
es muy agradable, pero afortunadamente es solo una macro, por lo que se puede agregar fácilmente a Lisps que no lo tiene. Common Lisp puede hacer coincidir patrones de luz en las listas a través dedestructuring-bind
. Es simple escribir unadestructuring-case
macro basada en ella, y muchas personas lo han hecho. Para Scheme haymatch
bibliotecas portátiles . Clojure tienecore.match
.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 (p. Ej., Servidor web) que otros Esquemas no incluyen.
fuente