Comme la plupart des autres Lisp, la syntaxe de Clojure repose sur des expressions S qui sont d'abord analysées en structures de données par un lecteur Lisp avant d'être compilées . Le lecteur de Clojure prend en charge la syntaxe littérale pour les dictionnaires , les ensembles et les vecteurs , ainsi que pour les listes, et ces éléments sont compilés directement en structures correspondantes. Clojure traite le code comme des données et possède un système de macros Lisp . Clojure est un Lisp-1 et n'est pas conçu pour être compatible avec les autres dialectes de Lisp, car il utilise son propre ensemble de structures de données incompatibles avec les autres Lisp.
Clojure prône l'immuabilité et les structures de données immuables , et encourage les programmeurs à gérer explicitement l'identité et ses états. Cette approche, qui privilégie la programmation avec des valeurs immuables et des constructions temporelles explicites, vise à faciliter le développement de programmes plus robustes, notamment concurrents , à la fois simples et rapides. Bien que son système de types soit entièrement dynamique , des travaux récents ont également porté sur la mise en œuvre d'un système de types dépendants .
Ce langage a été créé par Rich Hickey au milieu des années 2000, initialement pour la plateforme Java ; il a depuis été porté sur d’autres plateformes, comme le Common Language Runtime (.NET). Hickey continue d’en diriger le développement à vie .
Rich Hickey est le créateur du langage Clojure. Avant Clojure, il a développé dotLispun projet similaire basé sur la plateforme .NET , et trois tentatives antérieures d'interopérabilité entre Lisp et Java : une interface de langage étranger Java pour Common Lisp ( jfli), une interface d'objet étranger pour Lisp (FOIL), et une interface compatible Lisp pour les servlets Java (Lisplets).
Hickey a commencé à travailler sur Clojure en 2005 et y a consacré environ deux ans et demi avant de le rendre public en octobre 2007 . Pendant la majeure partie de ce temps, il s'est consacré exclusivement à Clojure, sans aucun financement extérieur. Son épouse, Stephanie Hickey, a contribué à la conception du langage en participant activement aux discussions et en étant à l'écoute, sans toutefois écrire de code . À la fin de cette période, Hickey a envoyé un courriel à quelques amis de la communauté Common Lisp pour annoncer la création du langage.
Le nom Clojure, selon Hickey, est un jeu de mots sur le concept de programmation « closure » incorporant les lettres C, L et J pour C# , Lisp et Java respectivement — trois langages qui ont eu une influence majeure sur la conception de Clojure.
Conception
Rich Hickey a développé Clojure car il souhaitait un Lisp moderne pour la programmation fonctionnelle , en symbiose avec la plateforme Java existante et conçu pour la concurrence . Il a également souligné l'importance de la simplicité dans la conception des langages de programmation et l'architecture logicielle, préconisant un couplage faible , le polymorphisme via des protocoles et des classes de types plutôt que l'héritage , des fonctions sans état organisées en espaces de noms plutôt que des méthodes , ou encore le remplacement de la syntaxe par des données .
L'approche de Clojure en matière d'état est caractérisée par le concept d'identités , représentées comme une série d'états immuables au fil du temps. Puisque les états sont des valeurs immuables, un nombre quelconque de processus peut les manipuler en parallèle, et la concurrence se résume à la gestion des transitions d'un état à un autre. À cette fin, Clojure fournit plusieurs types de référence mutables , chacun possédant une sémantique bien définie pour la transition entre états.
Clojure s'exécute sur la plateforme Java et, par conséquent, s'intègre à Java et prend pleinement en charge l'appel de code Java depuis Clojure , et inversement . La communauté utilise des outils tels que l'interface en ligne de commande (CLI) Clojure ou Leiningen pour l'automatisation des projets, offrant une prise en charge de l'intégration Maven . Ces outils gèrent les paquets et les dépendances du projet et sont configurés à l'aide de la syntaxe Clojure.
En tant que dialecte Lisp, Clojure prend en charge les fonctions comme objets de première classe , une boucle de lecture-évaluation-affichage (REPL) et un système de macros. Le système de macros Lisp de Clojure est très similaire à celui de Common Lisp, à l'exception du fait que la version Clojure de l' apostrophe inversée (appelée « guillemet syntaxique ») qualifie les symboles avec leur espace de noms . Ceci permet d'éviter les captures de noms involontaires, car la liaison à des noms qualifiés par un espace de noms est interdite. Il est possible de forcer l'expansion d'une macro capturante, mais cela doit être fait explicitement. Clojure n'autorise pas les macros de lecture définies par l'utilisateur, mais le lecteur prend en charge une forme plus contrainte d'extension syntaxique. Clojure prend en charge les multiméthodes et, pour les abstractions de type interface , dispose d'un système de polymorphisme basé sur un protocole et d'un système de types de données utilisant des enregistrements , offrant un polymorphisme dynamique et performant conçu pour éviter le problème d'expression .
Clojure prend en charge les séquences paresseuses et encourage le principe d' immuabilité et les structures de données persistantes . En tant que langage fonctionnel , il privilégie la récursivité et les fonctions d'ordre supérieur aux boucles à effets de bord. L'optimisation automatique des appels terminaux n'est pas prise en charge nativement par la JVM ; il est toutefois possible de l'implémenter explicitement à l'aide du mot-clé recur optimize` . Pour la programmation parallèle et concurrente , Clojure propose la mémoire transactionnelle logicielle , un système d'agents réactifs [ et la programmation concurrente basée sur les canaux .
Clojure 1.7 a introduit les conditions de lecture en autorisant l'intégration de code Clojure, ClojureScript et ClojureCLR dans un même espace de noms. Les transducteurs ont été ajoutés comme méthode de composition des transformations. Ils permettent aux fonctions d'ordre supérieur, telles que `map` et `fold` , de généraliser à n'importe quelle source de données d'entrée. Alors que traditionnellement ces fonctions opèrent sur des séquences , les transducteurs leur permettent de fonctionner sur des canaux et offrent à l'utilisateur la possibilité de définir ses propres modèles de transduction.
Notation de données extensible
Extensible Data Notation , ou edn , est un sous-ensemble du langage Clojure conçu comme format de transfert de données. Il permet de sérialiser et de désérialiser les structures de données Clojure, et Clojure lui-même utilise un sur-ensemble d'edn pour représenter les programmes.
edn s'utilise de manière similaire à JSON ou XML , mais possède une liste relativement importante d'éléments intégrés, présentés ici avec des exemples :
- booléens :
true,false - chaînes de caractères :
"foo bar" - caractères :
\c,ab - symboles :
name - mots-clés :
:key - entiers :
123 - nombres à virgule flottante :
3.14 - listes :
(a b 42) - vecteurs :
[a b 42] - cartes :
:bar,[123]four} - ensembles :
de type nul )
Outre ces éléments, il prend en charge l'extensibilité grâce à l'utilisation de balises , composées d'un caractère #suivi d'un symbole. Lorsqu'il rencontre une balise, le lecteur transmet la valeur de l'élément suivant au gestionnaire correspondant, qui renvoie une valeur de données. Par exemple, il pourrait s'agir d'un élément balisé : , dont l'interprétation dépendra du gestionnaire approprié du lecteur.:last"Mertz"}
Cette définition des éléments d'extension en fonction des autres évite de s'appuyer sur la convention ou le contexte pour transmettre des éléments non inclus dans l'ensemble de base.
Plateformes alternatives
La plateforme principale de Clojure est Java , mais d'autres implémentations cibles existent. La plus notable d'entre elles est ClojureScript, qui compile en ECMAScript 3 (ou ES5 ou ES5-strict plus récent, jusqu'à ES-2021, et ES-next possible) et ClojureCLR, un portage complet sur la plateforme .NET , interopérable avec son écosystème.
D'autres implémentations de Clojure sur différentes plateformes incluent :
- Babashka, Langage de script Clojure natif tirant parti de l'image native GraalVM et du Small Clojure Interpreter
- ClojureDart, Étendre la portée de Clojure aux applications mobiles et de bureau en portant Clojure vers Dart et Flutter
- Clojerl, Clojure sur BEAM , la machine virtuelle Erlang
- basilisp, Un dialecte Lisp compatible (ou presque) avec Clojure, ciblant Python 3.8+
- ClojureRS, Clojure sur Rust
- Ferret, compile en C++11 autonome pouvant s'exécuter sur des microcontrôleurs
- jank, Clojure natif hébergé en C++ sur un JIT basé sur LLVM
- Joker, un interprète et un linter écrit en Go
Outils
Les outils de développement Clojure ont connu des améliorations significatives au fil des ans. Voici une liste de quelques IDE et éditeurs de texte populaires dotés de plugins qui ajoutent la prise en charge de la programmation en Clojure :
- Emacs , avec CIDER
- IntelliJ IDEA , avec Cursive (une licence gratuite est disponible pour une utilisation non commerciale )
- Sublime Text , avec Clojure Sublimed, ou Tutkain,
- Vim , avec fireplace.vim, vim-elin, ou Conjure (Neovim uniquement)
- Visual Studio Code , avec Calva
- Indépendant de l'IDE : clojure-lsp comme serveur de langage ; clj-kondo comme linter (également utilisé par clojure-lsp)
En plus des outils fournis par la communauté, les outils officiels d'interface de ligne de commande (CLI) Clojure sont également disponibles sur Linux , macOS et Windows depuis Clojure 1.9.
Développement
Le processus de développement est réservé à l'équipe principale de Clojure, mais les problèmes sont visibles publiquement sur la page JIRA du projet Clojure. Toute personne peut poser des questions ou soumettre des problèmes et des idées sur ask.clojure.org. Si un nouveau problème justifie la création d'un ticket JIRA, un membre de l'équipe principale l'examinera et l'ajoutera. Les tickets JIRA sont traités par une équipe de modérateurs et finalement approuvés par Rich Hickey.
Impact
L'intérêt croissant pour la programmation fonctionnelle a entraîné une adoption toujours plus importante de Clojure par les développeurs utilisant la plateforme Java. Ce langage a également été recommandé par des développeurs tels que Brian Goetz, Eric Evans, James Gosling , Paul Graham , et Robert C. Martin . ThoughtWorks , lors de son évaluation des langages de programmation fonctionnelle pour son Technology Radar, a décrit Clojure comme « une implémentation simple et élégante de Lisp sur la JVM » en 2010 et l'a promu au rang de langage à adopter en 2012.
Dans le « JVM Ecosystem Report 2018 » (présenté comme « la plus grande enquête jamais réalisée auprès des développeurs Java »), préparé conjointement par Snyk et Java Magazine, Clojure se classe au deuxième rang des langages de programmation les plus utilisés sur la JVM pour les « applications principales ». Clojure est utilisé dans l’industrie par des entreprises telles qu’Apple , [ , [ Circle , Netflix , Nubank , Puppet , et Walmart , ainsi que par des agences gouvernementales comme la NASA . Il est également utilisé pour la création informatique, notamment dans les domaines des arts visuels, de la musique, des jeux et de la poésie.
Dans l'édition 2023 du sondage Stack Overflow auprès des développeurs, Clojure s'est classé quatrième parmi les langages de programmation et de script les plus appréciés : 68,51 % des répondants l'ayant utilisé l'année précédente ont déclaré vouloir continuer à l'utiliser. En revanche, dans la catégorie des langages souhaités , il n'a été cité que par 2,2 % des personnes interrogées, tandis que JavaScript, langage le mieux noté, a recueilli 40,15 % des suffrages des développeurs ayant participé au sondage.
Historique des versions
| Version | date de sortie | Principales caractéristiques et améliorations |
|---|---|---|
| (déni de service) | ||
| 1.12.0 | Plus d articles de Worldlex WikiRevenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais. Explorer l index |