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.
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. –
@ 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
@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' –