(ns com.my-company.clojure.examples.my-utils
(:import java.util.Date)
(:use [clojure.string :only (join)])
(:require [clojure.java.io :as jio]))
Clojureは、「lib」機能を通じて、コードのロードと依存関係の追跡を提供します。libは、クラスパス内のJavaリソースに含まれる、名前付きのClojureソースコードの単位です。libは通常、1つのClojure名前空間を構成する定義の完全なセットを提供します。
Clojureは、ライブラリの命名と構造に関する規約を定義しています。
ライブラリ名は、通常、ピリオドで区切られた2つ以上の部分を含むシンボルです。
ライブラリのコンテナは、クラスパス相対パスがライブラリ名から派生したJavaリソースです。
パスは文字列です。
ライブラリ名内のピリオドは、パス内でスラッシュに置き換えられます。
ライブラリ名内のハイフンは、パス内でアンダースコアに置き換えられます。
パスは「.class」、「.clj」、または「.cljc」で終わる場合があります(下記のライブラリのロード順を参照)。
ライブラリは、「ns」フォームで始まり、
その名前を共有するClojure名前空間を作成し、
Javaクラス、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]))
ns
フォームは、ライブラリの名前空間を命名し、その依存関係を宣言します。この名前を基に、このライブラリは通常、クラスパス相対パス:com/my_company/clojure/examples/my_utils.clj(ピリオドからスラッシュへの変換、ハイフンからアンダースコアへの変換に注意)にあるソースファイルで定義されます。
:import
句は、このライブラリによるjava.util.Date
の使用を宣言し、その修飾されていない名前を使用してこのライブラリのコードで使用できるようにします。
:use
句は、そのjoin
関数のみについてclojure.string
ライブラリへの依存関係を宣言します。joinはこのライブラリのコードで、その修飾されていない名前を使用して使用できます。
:require
句は、clojure.java.io
ライブラリへの依存関係を宣言し、そのメンバーをより短い名前空間エイリアスjio
を使用して使用できるようにします。
ライブラリが、完全名が共通のプレフィックスを共有するいくつかの他のライブラリに依存することが一般的です。require
とuse
への呼び出し(およびns
フォーム内の:require
と:use
句)では、共通のプレフィックスを抽出し、プレフィックスリストを使用して一度に提供できます。たとえば、次の2つのフォームは同等です。
(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))
ライブラリは、コンパイル済み(.class
)またはソース(.clj
または.cljc
)形式で存在する場合があります。場合によっては、これらのうち1つ、またはすべてがクラスパスに存在する場合があります。ライブラリは、次のルールに基づいて、これらのいずれかからロードされます。
ソースファイルのタイムスタンプが.class
ファイルより新しい場合を除き、.class
ファイルは常にソースファイルよりも優先されます。その場合は、ソースファイルが優先されます。
.clj
(プラットフォーム固有ファイル)は常に.cljc
(プラットフォーム間で共通)よりも優先されます。
2番目のルールにより、ライブラリアーは、libのポータブルな共通定義を提供しながら、ポータブルバージョンをオーバーライドしてホストプラットフォームを利用する何かを行うプラットフォーム固有のlibを提供することもできます。