# Racket (langage)

Racket est un langage de programmation de la famille Lisp. Il fait partie du projet Racket (autrefois PLT Scheme), qui regroupe plusieurs variantes du langage Scheme ainsi qu'une série d'outils pour les utiliser. L'un de ses objectifs est de servir de plateforme pour la création, la conception et l'implémentation.
Initialement, DrScheme a été conçu comme un environnement de développement à but pédagogique, pour servir de support au cours d'introduction à l'informatique de l'université Rice. D'abord basé sur le langage Scheme R$^5$RS, l'environnement implémente aujourd'hui le langage Racket, un dérivé de Scheme multi-paradigme. Le langage est utilisé tant que langage de script, programmation à usage général et dans de nombreux domaines comme l'enseignement en informatique et la recherche.
La plateforme fournit une implémentation du langage Racket (y compris un environnement d’exécution avancé, des bibliothèques variées, un compilateur à la volée) ainsi qu'un environnement de développement nommé Dr Racket (anciennement DrScheme) écrit en Racket.
Le cœur du langage est connu pour son système de macros avancé qui permet de créer des langages dédiés, des constructions du langage permettant de créer des classes et des modules et de nombreux dialectes du langage avec leur propre sémantique$^,$$^,$$^,$.
La distribution de la plateforme est de type Free/Libre Open Source Software et est distribué sous la Licence Publique Générale Limitée GNU également appelé GNU LGPL. Les extensions et packages créés par la communauté sont téléchargeables via le catalogue de packages centralisé de Racket.

## Histoire
### Développement

Matthias Felleisen a fondé PLT au milieu des années 1990, d'abord en tant que groupe de recherche, puis en tant que projet destiné à la production de matériel pédagogique pour les programmeurs débutants (conférences, exercices / projets, logiciels). En janvier 1995, le groupe a décidé de développer un environnement de programmation pédagogique basé sur Scheme. Matthew Flatt a bricolé MrEd, la machine virtuelle originale de Racket, issu de libscheme, wxWidgets, et de quelques autres systèmes libres. Dans les années qui ont suivi, une équipe composée de Flatt, Robby Findler, Shriram Krishnamurthi, Cormac Flanagan et bien d'autres ont produit DrScheme, un environnement de programmation pour les programmeurs novices Scheme et un environnement de recherche pour le typage faible. Le principal langage de développement pris en charge par DrScheme a été nommé PLT Scheme.
En parallèle, l'équipe a commencé à organiser des ateliers pour les enseignants du secondaire, les formant à la conception de programmes et à la programmation fonctionnelle. Les tests sur le terrain avec ces enseignants et leurs élèves ont fourni des indices essentiels pour orienter le développement.
Au cours des années suivantes, le PLT a ajouté des langages destinés à l'enseignement, de nombreuses autres innovations de DrScheme, produisant un environnement de développement de programmes pédagogiques de qualité.
En 2001, l'équipe principale (Felleisen, Findler, Flatt, Krishnamurthi) avait également écrit et publié son premier manuel, How to Design Programs, basé sur leur philosophie d'enseignement.

### Historique de version

La première génération de changements du Scheme PLT a introduit des fonctionnalités pour la programmation à grande échelle avec des modules et des classes. Le système de classes a acquis des fonctionnalités (par exemple, des interfaces de style ressemblant à Java) et a également perdu plusieurs fonctionnalités (héritage multiple) dans ces versions. Le langage a évolué à travers un certain nombre de versions successives et a gagné en popularité dans la version 53, menant à un travail considérable et menant à la version 100 qui équivaudrait à une version "1.0" dans les systèmes de version populaires actuels.
La version majeure suivante, intitulée Version 200, introduit un nouveau système de modules par défaut qui fonctionnent avec les macros. En particulier, le système de modules garantit que les calculs au moment de l'exécution et de la compilation sont séparés.
La version 300 introduisait la prise en charge du standard Unicode, la prise en charge de bibliothèques externes et des améliorations apportées au système de classes. Par la suite, la série des Version 300 a amélioré les performances de l'exécution du langage avec l'ajout d'un compilateur à la volée et le passage à un ramasse-miettes par défaut. Lors de la version suivante, le projet était passé à une numérotation de versions basée sur des séquences plus conventionnelle. La version 4.0 introduisait le raccourci #lang pour spécifier la langue dans laquelle un module était écrit. De plus, la révision introduisait des paires et des listes immuables, la prise en charge du parallélisme fin et un dialecte statiquement typé.
La prochaine version 7 de Racket est destinée à avoir un nouvel extenseur de macros écrit en Racket.

### Renommage

Le 7 juin 2010, le système PLT a été renommé Racket. Le changement de nom a coïncidé avec la publication de la version 5.0. Par la suite, l'interface graphique côté serveur a été réécrite en Racket à partir du langage C++ dans la version 5.1 en utilisant des widget toolkits sur toutes les plateformes.
La version 5.2 incluait un outil d'analyse statique de programmes en arrière-plan, une nouvelle bibliothèque de dessin, une bibliothèque de base de données. La version 5.3 incluait une nouvelle fonctionnalité de sous-module pour les modules optionnels, de nouveaux outils d'optimisation, une bibliothèque JSON et d'autres fonctionnalités. La version 5.3.1 apportait d'importantes améliorations à DrRacket : le vérificateur de syntaxe d'arrière-plan était activé par défaut et un nouvel outil de prévisualisation de la documentation était ajouté.
Dans la version 6.0, Racket a publié son système de gestion de paquets de deuxième génération. Dans le cadre de ce développement, les principaux référentiels DrRacket et Racket ont été réorganisés et divisés en un grand ensemble de petits packages, ce qui permet d'installer un Racket minimal et d'installer uniquement les packages strictement nécessaires.

## Fonctionnalités

Le langage principal de Racket comprend les macros, les modules, les clôtures lexicales, les récursions terminales, les paramètres (variables fluides), la programmation par contrat, les green threads et threads natifs$^,$$^,$.
Le langage est également fourni avec des primitives, telles que des eventspaces et des custodians, qui contrôlent la gestion des ressources et lui permettent de se comporter comme un système d'exploitation permettant de charger et de gérer d'autres programmes. D'autres extensions peuvent être créées avec le puissant système de macros qui, associé au système de modules et à des analyseurs syntaxiques personnalisés, peut contrôler tous les aspects du langage. Contrairement aux langages de programmation dépourvus de systèmes de macros, la plupart des constructions de langage dans Racket sont écrites sur le langage de base à l'aide de macros. Ceux-ci incluent un système de classe mixin et le filtrage par motifs.
De plus, le langage contient le premier système de contrat pour un langage de programmation de haut niveau. Le système de contrat de Racket s'inspire du travail sur la programmation par contrat de Eiffel et l'étend pour qu'il fonctionne pour des valeurs de haut niveau telles que des fonctions de première classe, des objets, des références, etc. Par exemple, un objet vérifié par contrat peut être amené à effectuer des contrôles de contrat lorsque ses méthodes sont éventuellement appelées.
Le compilateur de Racket est un compilateur de code intermédiaire qui se transforme en un code interne exécuté par la machine virtuelle Racket. Sur les plateformes x86 et PowerPC, le bytecode est en outre compilé à l'aide d'un compilateur à la volée au moment de l'exécution.
Depuis 2004, le langage est également fourni avec PLaneT, un gestionnaire de paquets intégré au système de modules, qui permet d'importer et d'utiliser de manière transparente des logiciels tiers. En outre, PLaneT a une politique de version intégrée.
À la fin de 2014, une grande partie du code de Racket avait été transféré dans un nouveau système de packages distinct de la base du code principal. Ce nouveau système de packages est utilisable par un programme client appelé raco. Le nouveau système de paquets offre moins de fonctionnalités que PLaneT; Un article de Jay McCarthy sur le blog Racket explique les raisons du changement et explique comment dupliquer l'ancien système.

### Macros et extensions

La fonctionnalité qui distingue Racket des autres langues de la famille Lisp est sa souplesse. Les fonctions d'extensibilité de Racket sont intégrées au système de modules pour permettre un contrôle de la syntaxe en fonction du contexte et au niveau du module. Par exemple, la forme syntaxique #% app peut être remplacée pour modifier la sémantique de l'application de la fonction. De même, la forme #% module-begin permet une analyse statique arbitraire de tout le module. Comme tout module peut être utilisé en tant que langage, via la notation #lang, cela signifie que pratiquement tout aspect du langage peut être programmé et contrôlé.
Les fonctionnalités d'extensibilité au niveau des modules sont combinées à un système de macro de type Scheme, qui fournit davantage de fonctionnalités que le système de s-expression de Lisp$^,$, les macros hygiéniques à syntaxe étendue de Scheme 84 ou les règles de syntaxe de R5RS. En effet, le système de macros est une interface de programmation d'application (API) réglée pour les extensions du compilateur.
Le système de macros de Racket a été utilisé pour construire des dialectes d'un langage complet. Cela inclut Typed Racket - un dialecte statiquement typé qui facilite la migration du code non typé vers le code typé, et Lazy Racket - un dialecte dont l'évaluation est paresseuse. Parmi les autres dialectes, on compte FrTime (programmation réactive fonctionnelle), Scribble (langage de documentation), Slideshow (langage de présentation) et plusieurs langages à visée éducative$^,$. La distribution principale de Racket fournit des bibliothèques pour faciliter le processus de construction de nouveaux langages de programmation.
Ces langages ne sont pas limités à la syntaxe basée sur les s-expressions. En plus des extensions de syntaxe classiques basées sur une table de lecture, #lang de Racket permet à un programmeur de langage de définir un analyseur quelconque, par exemple à l'aide de la bibliothèque d'outils d'analyse.

## Environnement de programmation

La plateforme linguistique fournit un EDI auto-hébergé nommé DrRacket, une interface graphique, et d'autres outils. Racket est également un outil de script viable et peut être utilisé pour les scripts shell Unix. Il peut analyser les arguments en ligne de commande, exécuter des outils externes et inclut des bibliothèques comme tous les langages de script courants.

### IDE DrRacket

DrRacket (anciennement DrScheme) est largement utilisé parmi les cours d'initiation à l'informatique qui enseignent Scheme ou Racket. Il est loué pour sa simplicité et son attrait pour les programmeurs débutants. L'IDE a été initialement conçu pour être utilisé avec le projet TeachScheme! (maintenant ProgramByDesign), une initiative de l'université du Nord-Est et de plusieurs universités affiliées visant à attirer les étudiants du secondaire dans des cours d’informatique de niveau universitaire.
L'éditeur fournit une mise en évidence des sources pour les erreurs de syntaxe et d'exécution, la mise en correspondance des parenthèses, un débogueur et un stepper algébrique. Ses fonctionnalités appréciables par les étudiants incluent la prise en charge de plusieurs « niveaux de langue » (débutant, intermédiaire, etc.) Il intègre également un support de bibliothèque et des outils d'analyse sophistiqués pour les programmeurs avancés. En outre, la programmation orientée module est prise en charge avec le navigateur de module et une prise en charge du réusinage du code. Il fournit un accès intégré, sensible au contexte, à un système d’aide complet appelé « Help Desk ».
DrRacket est disponible pour Windows (à partir de la version 95), MacOS, Unix et Linux avec le système X Window et les programmes se comportent de la même manière sur toutes ces plates-formes.

## Applications et utilisation pratique

Racket a été conçu pour être utilisé comme langage polyvalent dans les systèmes de production. Ainsi, la distribution Racket propose une vaste bibliothèque qui couvre la programmation système et réseau, le développement Web, une interface uniforme pour le système d’exploitation sous-jacent, plusieurs types d’expressions régulières, des générateurs de lexer / parseur, programmation logique et un framework d’interface graphique.
Racket possède plusieurs fonctionnalités utiles pour un langage commercial, notamment la possibilité de générer des exécutables sous Windows, macOS et Unix, un profileur et un débogueur inclus dans l'environnement de développement intégré (IDE) et un framework de test unitaire.
Racket a été utilisé pour des projets commerciaux et des applications Web. Un exemple notable est le site Web Hacker News, qui fonctionne sur Arc, qui est développé en Racket. Naughty Dog l'a utilisé comme langage de script dans plusieurs de leurs jeux vidéo.
Racket est utilisé pour enseigner l'algèbre aux étudiants grâce à la conception de jeux dans le cursus Bootstrap.