En quoi la raquette est-elle différente de Scheme?

184

Racket est un descendant de Scheme. En quoi la raquette est-elle différente de la R6RS? Qu'a-t-il ajouté, ou retiré, ou est-il simplement différent?

Je comprends que Racket est plus qu'une langue, c'est une plateforme pour les langues. Mais je fais référence au dialecte principal de Racket.

boue
la source

Réponses:

132

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 letrecest appelé letrec*dans R6RS et n'existe pas dans R5RS, ce que R5RS et R6RS appellent letrecn'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.

Zorf
la source
24
In Racket ()n'est pas valide, ne s'auto-évalue pas. En outre, Racket ne sont plus limités letrec- par exemple, celui de la r5rslangue; c'est un choix intentionnel d'utiliser la letrec*version -like dans la langue par défaut.
Eli Barzilay
9
@ Eli, oups, vous avez raison, la raquette fonctionnant en mode Swindle semble envisager de ()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.
Zorf
@Zorf Cela peut facilement être changé par surcharge #%app, cependant:#lang racket (require (rename-in racket [#%app old])) (define-syntax #%app (syntax-rules () [(_) '()] [(_ . rest) (old . rest)])) (null? ()) ;; => #t
Suzanne Dupéron
2
Cette réponse doit être mise à jour. L'ensemble des fonctionnalités de Racket l'emporte de loin sur celui de Scheme maintenant, avec des modules et des définitions de langue, etc.
CinchBlue
1
@MaliRemorker Je ne comprends pas exactement ce que vous voulez dire, mais Scheme est actuellement sur R7RS et était sur R6RS. Mais Racket surpasse toujours l'ensemble des fonctionnalités du R6RS.
CinchBlue
36

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.

deinst
la source
24
Je pense que le changement de nom était dû au fait qu'ils ne voulaient pas être un dialecte de Scheme avec un tas d'ajouts non standard - ils voulaient être un langage basé sur Scheme avec un tas plus de standards. Classifier PLT Scheme comme "juste" un dialecte de Scheme revient à classer Ruby comme dialecte de Mirah - ce n'est pas inexact, mais cela minimise en quelque sorte les atouts de la langue.
Chuck
5
Je pense qu'utiliser un nom différent est une sage décision: utiliser le même nom pour différentes langues qui ont une origine commune est déroutant pour l'OMI. Je changerais le nom même si le langage contenait Scheme en tant que sous-ensemble mais contenait tellement d'ajouts que cela encouragerait un style de programmation très différent.
Giorgio
18

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:

  • suites délimitées (plus générales que call / cc)
  • marques de continuation
  • fils
  • des endroits
  • ffi

Le module et le système de macro sont beaucoup plus généraux que la spécification RnRS. Avec la #langspé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 consconstruire une paire immuable ( mconsconstruit une paire mutable). Un avantage d'avoir des paires immuables, est qu'il lengthfonctionne maintenant en temps amorti O (1).

Soegaard
la source
2
... mais cela rend impossible l'ajout de la liste O (1).
Will Ness
16

Racket inclut beaucoup de constructions de langage vraiment sympas non incluses dans le schéma R6RS, comme "match" .

Gautam
la source
3
Pourquoi "match" serait-il une fonctionnalité intéressante? Au moins, lorsque vous exprimez une opinion, vous devriez en donner une brève explication, afin que les personnes qui ne connaissent pas bien Racket puissent comprendre pourquoi «match» est théoriquement bénéfique.
nbro
1
Le Pattern Matching est une fonctionnalité vraiment souhaitée dans de nombreux langages avec des antécédents de programmation fonctionnels, malheureusement même R6RS ou Common Lisp ne l'implémente pas par défaut, donc oui, c'est une fonctionnalité vraiment intéressante et différentielle fournie par Racket. Par exemple, des langages comme Haskell, Elixir, Rust et F # fournissent ce type de constructions et sont très utilisés. Personnellement, je fais de la programmation Lisp principalement en Common Lisp et je manque dans de nombreux cas le manque d'implémentation de correspondance de modèles.
Manoel Vilela du
1
matchc'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 via destructuring-bind. C'est simple d'écrire une destructuring-casemacro basée sur elle, et beaucoup de gens l'ont fait. Pour Scheme, il existe des matchbibliothèques portables . Clojure a core.match.
Lassi
Les macros peuvent rendre le code difficile à lire car elles ont souvent une sémantique spéciale, par conséquent le langage devrait toujours normaliser toutes les macros à usage général afin que tout le monde ne construise pas ses propres macros. La correspondance de motif doit être la valeur par défaut, tout comme dans Arc & Clojure & Racket & Ocaml & Haskell car elle spécifie plus directement l'intention. Caddr est un niveau trop bas.
aoeu256
12

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.

Mandrin
la source