Utilisation des bibliothèques
Clojure permet le chargement de code et le suivi des dépendances grâce à son système de bibliothèques («lib»). Une bibliothèque est une unité nommée de code source Clojure, contenue dans une ressource Java du classpath. Elle fournit généralement l'ensemble des définitions constituant un espace de noms Clojure.
Conventions relatives aux bibliothèques
Clojure définit des conventions pour nommer et structurer les bibliothèques :
- Le nom d'une bibliothèque est un symbole contenant généralement au moins deux parties séparées par des points.
- Le conteneur d'une bibliothèque est une ressource Java dont le chemin relatif au classpath est dérivé du nom de la bibliothèque :
- Le chemin est une chaîne de caractères.
- Les points dans le nom de la bibliothèque sont remplacés par des barres obliques dans le chemin.
- Les tirets dans le nom de la bibliothèque sont remplacés par des traits de soulignement dans le chemin.
- Le chemin peut se terminer par «.class», «.clj» ou «.cljc» (voir l'ordre de chargement des bibliothèques ci-dessous).
- Une bibliothèque commence par une déclaration «ns» qui :
- crée l'espace de noms Clojure portant son nom ; et
- déclare ses dépendances vis-à-vis des classes Java, des fonctionnalités principales de Clojure et/ou d'autres bibliothèques.
Clojure garantit que si l'appel à «ns» s'achève sans exception, les dépendances déclarées sont satisfaites et les fonctionnalités qu'elles offrent sont disponibles.
Exemple de bibliothèque
Une bibliothèque simple :
- (ns com.my-company.clojure.examples.my-utils
- (:import java.util.Date)
- (:use [clojure.string :only (join)])
- (:require [clojure.java.io :as jio]))
- La forme `ns` spécifie l'espace de noms de la bibliothèque et déclare ses dépendances. D'après son nom, cette bibliothèque est généralement définie dans un fichier source situé à un chemin relatif au classpath : `com/my_company/clojure/examples/my_utils.clj` (notez la conversion du point en barre oblique et du tiret en trait de soulignement).
- La clause `:import` déclare l'utilisation de `java.util.Date` par cette bibliothèque et la rend disponible dans le code de cette bibliothèque sous son nom non qualifié.
- La clause `:use` déclare une dépendance à la bibliothèque `clojure.string` pour sa fonction `join` uniquement. `join` peut être utilisée dans le code de cette bibliothèque sous son nom non qualifié.
- La clause `:require` déclare une dépendance à la bibliothèque `clojure.java.io` et permet d'utiliser ses membres sous l'alias d'espace de noms plus court `jio`.
Listes de préfixes
Il est fréquent qu'une bibliothèque dépende de plusieurs autres bibliothèques dont les noms complets partagent un préfixe commun. Lors des appels à `require` et `use` (et dans les clauses `:require` et `:use` d'une forme `ns`), le préfixe commun peut être extrait et fourni une seule fois grâce à une liste de préfixes. Par exemple, ces deux formes sont équivalentes :
- (require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
- (require '(clojure.contrib def except sql))
Fonctions associées
| Catégorie | Fonctions |
|---|---|
| Création d'un espace de noms | ns |
| S'assurer qu'une bibliothèque est chargée | require use |
| Liste des bibliothèques chargées | loaded-libs |
Ordre de chargement des bibliothèques
Les bibliothèques peuvent exister sous forme compilée (.class) ou sous forme de code source (.clj ou .cljc). Il est possible que plusieurs de ces fichiers soient présents dans le classpath. Le chargement de la bibliothèque se fait selon les règles suivantes :
- Un fichier .class est toujours prioritaire sur un fichier source, sauf si l'horodatage de ce dernier est plus récent. Dans ce cas, c'est le fichier source qui est prioritaire.
- Un fichier .clj (spécifique à la plateforme) est toujours prioritaire sur un fichier .cljc (commun à toutes les plateformes).
La deuxième règle permet à un auteur de bibliothèque de fournir à la fois une définition commune portable d'une bibliothèque et des bibliothèques spécifiques à la plateforme remplaçant la version portable pour effectuer une opération tirant parti de la plateforme hôte.