drracket - ¿En qué se diferencia Racket de Scheme?
racket online (6)
Racket es un descendiente de Scheme. ¿En qué se diferencia la raqueta de la R6RS? ¿Qué agregó, quitó o simplemente es diferente?
Entiendo que Racket es más que un lenguaje, es una plataforma para idiomas. Pero me refiero al dialecto principal de la Raqueta.
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.
La especificación del lenguaje R5RS en el lenguaje de programación del Esquema se basa en el consenso entre los múltiples implementadores del Esquema. 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 mucho. Algunas extensiones se definen como macros, pero algunas funciones requieren el soporte del sistema de tiempo de ejecución.
Las características en Racket no se pueden implementar solo con macros:
- Continuidades delimitadas (más generales que call / cc)
- marcas de continuación
- trapos
- lugares
- ffi
El módulo y el macro sistema son mucho más generales que la especificación RnRS. Junto con #lang
reader / language specification hace posible definir idiomas personalizados (con sintaxis personalizada) y usarlos con los 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 la length
ahora se ejecuta en O (1) tiempo amortizado.
La justificación para el cambio de nombre de PLT Scheme a Racket se analiza en el sitio Racket .
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.
Racket incluye muchos constructos de lenguaje realmente agradables no incluidos en el esquema R6RS, como "match" .
Racket 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:
- Racket no tiene
set-cdr!
yset-car!
, más bienset-mcar!
que solo funciona en parejas creadas específicamente como mutables. - Lo que Racket llama a
letrec
se llamaletrec*
en R6RS y no existe en R5RS, lo que R5RS y R6RS llamanletrec
no existe en Racket. - En Racket, muchas cosas se autoevalúan, lo que generaría un error en R5RS, y lo
más importante, la lista vacía. - La raqueta distingue entre mayúsculas y minúsculas, aunque R6RS también es sensible a mayúsculas
- Racket 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.