Respuestas:
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:
set-cdr!
y set-car!
, más bien, set-mcar!
que solo funciona en pares creados específicamente como mutables.letrec
se llama letrec*
en R6RS y no existe en R5RS, lo que R5RS y R6RS llaman letrec
no existe en Racket.( ... )
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.
()
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.
La justificación del cambio de nombre del Esquema PLT a Racket se discute en el sitio Racket .
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 que length
ahora se ejecuta en O (1) tiempo amortizado.
Racket incluye muchas construcciones de lenguaje realmente agradables no incluidas en el esquema R6RS, como "match" .
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 de destructuring-bind
. Es simple escribir una destructuring-case
macro basada en ella, y muchas personas lo han hecho. Para Scheme hay match
bibliotecas portátiles . Clojure tiene core.match
.
()
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.