Autres bibliothèques incluses
Utilitaires Java (clojure.java.*)
clojure.java.basis
Accès à la base d'exécution initiale et actuelle, spécifiant les bibliothèques et les versions actuellement chargées sur le classpath de la JVM.
clojure.java.io
Contient des fonctions utilitaires d'entrée/sortie polymorphes pour Clojure, reposant sur des classes Java.
clojure.java.javadocs
Fournit la fonction javadoc tentant d'afficher la documentation Javadoc appropriée pour une classe ou une instance de classe.
clojure.java.process
Prise en charge du lancement et de la communication entre sous-processus. Cet espace de noms remplace clojure.java.shell et utilise les API de processus Java les plus récentes.
clojure.java.shell
Fournit une fonction sh facilitant le lancement et la gestion de sous-processus. Consultez la documentation de la fonction pour plus de détails sur ses arguments attendus.
Traitement parallèle (DÉPRÉCIÉ)
La bibliothèque parallèle (espace de noms parallel, dans parallel.clj) encapsule la bibliothèque ForkJoin. Cette bibliothèque est désormais obsolète.
L'idée principale est de convertir les collections Clojure, et plus particulièrement les vecteurs, en tableaux parallèles utilisables par cette bibliothèque grâce à la fonction `par`. La plupart des fonctions acceptent des collections et appellent `par` si nécessaire. En général, il suffit donc d'appeler explicitement `par` pour y attacher des opérations de limitation, de filtrage et de cartographie.
Les tableaux parallèles permettent d'attacher des fonctions de limitation, de filtrage et de cartographie avant leur réalisation/calcul, résultant de diverses opérations sur le tableau (pvec, psort, pfilter-nils, pfilter-dupes). Au lieu d'effectuer des opérations composites par étapes, comme c'est généralement le cas avec les séquences, les fonctions de mappage et de filtrage sont attachées et composées en fournissant des opérations à `par`. Notez que l'ordre d'attachement est important : les limitations précèdent les filtres, qui précèdent eux-mêmes les fonctions de cartographie. Toutes les opérations s'exécutent alors en parallèle, à l'aide de plusieurs processus légers et d'un système sophistiqué de vol de travail basé sur fork-join, soit lors de la création du tableau, soit pour effectuer des opérations d'agrégation telles que preduce/pmin/pmax,...
Un tableau parallèle peut être réalisé sous forme de vecteur Clojure à l'aide de pvec :
- (load-file "src/parallel.clj")
- (refer 'parallel)
-
- (def f (vec (take 20 (repeatedly #(rand-int 20)))))
-
- f
- -> [11 7 10 9 4 1 4 18 15 13 10 7 0 9 16 6 19 11 14 7]
-
- ;renvoie les paires valeur/index de toutes les entrées inférieures à leur index, en parallèle
-
- (pvec (par f :filter-index < :map-index vector))
- -> [[1 5] [4 6] [7 11] [0 12] [9 13] [6 15] [11 17] [14 18] [7 19]]
Utilitaires de réflexion (clojure.reflect)
Fournit des fonctions et des protocoles utiles pour collecter et construire des informations de réflexion de type hôte sous forme de données Clojure.
Utilitaires REPL (clojure.repl)
Utilitaires conçus pour une utilisation interactive dans le REPL.
Ensembles et algèbre relationnelle (clojure.set)
Fonctions utiles pour manipuler, construire et interroger des ensembles mathématiques à l'aide de l'algèbre relationnelle.
Manipulation de chaînes de caractères (clojure.string)
Fonctions pour la manipulation de chaînes de caractères.
Tests unitaires (clojure.test)
Un cadre d'application de tests unitaires pour Clojure.
Parcourir les structures de données (clojure.walk)
Utilitaires pour parcourir et manipuler les structures de données imbriquées.
XML (clojure.xml)
Utilitaires pour la lecture et l'écriture de données XML.
Zippers - Édition fonctionnelle d'arbres (clojure.zip)
Clojure propose une navigation et une édition d'arbres purement fonctionnelles et génériques, grâce à une technique appelée zipper (dans l'espace de noms zip). Pour plus d'informations, consultez l'article de Huet. Un zipper est une structure de données représentant un emplacement dans une structure de données hiérarchique, ainsi que le chemin emprunté pour y parvenir. Il permet la navigation vers le bas, le haut, la gauche et la droite, et l'« édition » fonctionnelle localisée, l'insertion et la suppression de nouds. Avec les zippers, vous pouvez écrire du code qui ressemble à un parcours impératif et destructif d'un arbre, appeler la fonction root une fois le parcours terminé et obtenir un nouvel arbre reflétant toutes les modifications, alors qu'en réalité, rien n'est modifié : le code est thread-safe et partageable. La fonction suivante effectue un parcours en profondeur, ce qui permet de créer des boucles faciles à comprendre :
- (def data '[[a * b] + [c * d]])
- (def dz (zip/vector-zip data))
-
- ;trouver le deuxième *
- (-> dz zip/down zip/right zip/right zip/down zip/right zip/node)
- -> *
-
- ;supprimer les 2 premiers termes
- (-> dz zip/next zip/remove zip/next zip/remove zip/root)
- -> <<c * d#,c * d>>
-
-
- ;'remplacer' * par /
- (loop [loc dz]
- (if (zip/end? loc)
- (zip/root loc)
- (recur
- (zip/next
- (if (= (zip/node loc) '*)
- (zip/replace loc '/)
- loc)))))
-
- -> [[a / b] + [c / d]]
-
-
- ;'enlève' *
- (loop [loc dz]
- (if (zip/end? loc)
- (zip/root loc)
- (recur
- (zip/next
- (if (= (zip/node loc) '*)
- (zip/remove loc)
- loc)))))
-
- -> [[a b] + [c d]]
-
-
- ;L'original est intact
- (zip/root dz)
- -> [[a * b] + [c * d]]
Des constructeurs Zipper sont fournis pour les séquences imbriquées, les vecteurs imbriqués et les éléments XML générés par xml/parse. Une fonction de 4 à 5 lignes suffit pour prendre en charge d'autres structures de données.