Clojure

ライブラリの使用

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を使用して使用できるようにします。

プレフィックスリスト

ライブラリが、完全名が共通のプレフィックスを共有するいくつかの他のライブラリに依存することが一般的です。requireuseへの呼び出し(およびnsフォーム内の:require:use句)では、共通のプレフィックスを抽出し、プレフィックスリストを使用して一度に提供できます。たとえば、次の2つのフォームは同等です。

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

名前空間の作成:ns

ライブラリのロードの確認:require use

ロードされたライブラリのリスト:loaded-libs

ライブラリのロード順

ライブラリは、コンパイル済み(.class)またはソース(.cljまたは.cljc)形式で存在する場合があります。場合によっては、これらのうち1つ、またはすべてがクラスパスに存在する場合があります。ライブラリは、次のルールに基づいて、これらのいずれかからロードされます。

  • ソースファイルのタイムスタンプが.classファイルより新しい場合を除き、.classファイルは常にソースファイルよりも優先されます。その場合は、ソースファイルが優先されます。

  • .clj(プラットフォーム固有ファイル)は常に.cljc(プラットフォーム間で共通)よりも優先されます。

2番目のルールにより、ライブラリアーは、libのポータブルな共通定義を提供しながら、ポータブルバージョンをオーバーライドしてホストプラットフォームを利用する何かを行うプラットフォーム固有のlibを提供することもできます。