Использование библиотек

Clojure обеспечивает загрузку кода и отслеживание зависимостей с помощью библиотек. Библиотека - это именованная единица исходного кода Clojure, содержащаяся в Java-ресурсе в пределах classpath. Обычно библиотека предоставляет полный набор определений, составляющих одно пространство имен Clojure.

Конвенции библиотек

Clojure определяет соглашения для именования и структурирования библиотека:

Clojure гарантирует, что если вызов “ns” завершается без выброса исключения, то объявленные зависимости были удовлетворены и возможности, которые они предоставляют, доступны.

Пример библиотеки

Простая библиотека:

(ns com.my-company.clojure.examples.my-utils
  (:import java.util.Date)
  (:use [clojure.string :only (join)])
  (:require [clojure.java.io :as jio]))

Списки префиксов

Часто бывает, что библиотека зависит от нескольких других библиотек, полные имена которых имеют общий префикс. В вызовах require и use (и в выражениях :require и :use внутри формы ns) общий префикс может быть извлечен и предоставлен один раз с помощью списка префиксов. Например, эти две формы эквивалентны:

(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))

Связанные функции

Создание пространства имен: ns

Обеспечение загрузки библиотеки: require use

Перечисление загруженных библиотек: loaded-libs

Порядок загрузки библиотеки

Библиотеки могут существовать как в скомпилированном (.class), так и в исходном виде (.clj или .cljc). В некоторых случаях в classpath может существовать один из них или даже все. Библиотека загружается из одного из них на основе следующих правил:

Второе правило позволяет автору библиотеки поставлять как переносимое общее определение библиотеки, так и поставлять специфические для платформы библиотеки, которые переопределяют переносимую версию, чтобы сделать что-то, использующее возможности хост-платформы.