La raquette est finalement basée sur R5RS, et non sur R6RS et pas sur un sur-ensemble strict de l'un ou l'autre. Je ne pense pas que cela puisse être appelé «Scheme» car il n'est rétrocompatible avec aucune norme de Scheme.
La plupart des implémentations offrent des extensions, mais sont par ailleurs rétrocompatibles, bien sûr, le compilateur fourni avec Racket peut également fonctionner en mode R5RS ou R6RS. Un schéma R5 / 6RS valide qui fonctionne en mode raquette peut soit être rejeté, soit provoquer des erreurs d'exécution, soit se comporter différemment de ce qu'il devrait. Cela dit, les principaux points où il n'est pas rétrocompatible sont:
- La raquette n'a pas de
set-cdr!
et set-car!
, set-mcar!
qui ne fonctionne que sur des paires spécifiquement créées comme mutables.
- Ce que Racket appelle
letrec
est appelé letrec*
dans R6RS et n'existe pas dans R5RS, ce que R5RS et R6RS appellent letrec
n'existe pas dans Racket.
- Dans Racket, beaucoup de choses s'auto-évaluent, ce qui soulèverait une erreur dans R5RS,
surtout la liste vide .
- La raquette est sensible à la casse, bien que R6RS soit également sensible à la casse
- Raquette traite
( ... )
et [ ... ]
comme équivalent, R5RS ne le fait pas, mais R6RS le fait.
Il y en a probablement plus, mais sur la plupart des autres pièces, la raquette est un sur-ensemble de Scheme.
()
n'est pas valide, ne s'auto-évalue pas. En outre, Racket ne sont plus limitésletrec
- par exemple, celui de lar5rs
langue; c'est un choix intentionnel d'utiliser laletrec*
version -like dans la langue par défaut.()
s'auto-évaluer, j'étais confuse avec celle-là. Je n'ai jamais vraiment compris pourquoi je ne m'auto-évaluais()
pas dans Scheme comme c'est le cas en Common Lisp.#%app
, cependant:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Il contient des listes immuables, comme mentionné ci-dessus. Il contient également un système de structure un peu plus propre que le système d'enregistrement R6RS. Il a une classe orientée objet et un système objet. Il a un support natif pour la conception par contrat. Il dispose d'un système d'unités rappelant le système de modules ML, ainsi que d'un système de modules semblable au système de modules R6RS. Je suis sûr que j'ai oublié autant de choses que je l'ai mentionné.
Je ne suis pas sûr que le changement de nom ait été utile pour autre chose qu'un gadget marketing, mais le racket est définitivement un dialecte distinct du schéma.
la source
La justification du changement de nom de PLT Scheme à Racket est discutée sur le site Racket .
la source
La spécification de langage R5RS sur le langage de programmation Scheme est basée sur un consensus entre les multiples implémenteurs de Scheme. Cela implique que la langue est très stable. Cela implique également que de nombreuses fonctionnalités utiles ne font pas partie de la norme R5RS.
Racket s'est basé sur R5RS et l'a considérablement étendu. Certaines extensions sont définies comme des macros, mais certaines fonctionnalités nécessitent la prise en charge du système d'exécution.
Les fonctionnalités de Racket ne peuvent pas être implémentées uniquement par des macros:
Le module et le système de macro sont beaucoup plus généraux que la spécification RnRS. Avec la
#lang
spécification du lecteur / langage, il est possible de définir des langages personnalisés (avec une syntaxe personnalisée) et de les utiliser avec les programmes Racket normaux.Dans quelques cas, Racket a des constructions dont le comportement diffère de R5RS. Le plus évident est de
cons
construire une paire immuable (mcons
construit une paire mutable). Un avantage d'avoir des paires immuables, est qu'illength
fonctionne maintenant en temps amorti O (1).la source
Racket inclut beaucoup de constructions de langage vraiment sympas non incluses dans le schéma R6RS, comme "match" .
la source
match
c'est très bien mais heureusement c'est juste une macro donc elle peut être facilement ajoutée aux Lisps qui ne l'ont pas. Common Lisp peut faire des correspondances de motifs légers sur des listes viadestructuring-bind
. C'est simple d'écrire unedestructuring-case
macro basée sur elle, et beaucoup de gens l'ont fait. Pour Scheme, il existe desmatch
bibliothèques portables . Clojure acore.match
.Pour un grand exemple, les listes Racket sont immuables par défaut alors que celles de Scheme sont mutables. Racket comprend également de nombreuses bibliothèques standard (par exemple, Web Server) que d'autres Schémas ne proposent pas.
la source