Clojure

その他の組み込みライブラリ

その他の組み込みライブラリ

Javaユーティリティ (clojure.java.*)

clojure.java.io JavaクラスによってサポートされるClojure用の多態的なI/Oユーティリティ関数が含まれています。

クラスまたはインスタンスクラスに適切なJavadocを表示しようと試みる関数 javadoc を提供します。

サブプロセスの起動と管理を容易にする sh 関数を提供します。期待される引数の詳細については、関数ドキュメントを参照してください。

並列処理 (非推奨)

並列ライブラリ (名前空間 * **parallel** *、parallel.clj内) は、ForkJoinライブラリ をラップしています。このライブラリは現在非推奨です。

基本的な考え方は、Clojureコレクション、そして最も効率的なベクターは、関数parを使用してこのライブラリで使用するために並列配列に変換できるということです。ただし、ほとんどの関数はコレクションを受け取り、必要に応じて * **par** * を呼び出すため、通常は、bound/filter/map操作をアタッチするために明示的にparを呼び出すだけで済みます。

並列配列は、実現/計算の前に境界、フィルター、マッピング関数の添付をサポートします。これは、配列に対するいくつかの操作 (pvec/psort/pfilter-nils/pfilter-dupes) の結果として発生します。シーケンス、マップ、フィルターで通常行われるように、複合操作を段階的に実行するのではなく、 * **par** * に操作を提供することにより、マップとフィルターがアタッチされ、構成されます。アタッチメントには順序の感度があることに注意してください。境界はフィルターの前にあり、マッピングの前にあります。その後、すべての操作は、配列が実現されたとき、またはpreduce/pmin/pmaxなどの集計操作を実行するために、複数のスレッドとfork-joinによってサポートされる高度なワークスティーリングシステムを使用して並列に実行されます。

並列配列は、pvecを使用してClojureベクターに実現できます

(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]

;return value/index pairs of all entries < their index, in parallel

(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]]

リフレクションユーティリティ (clojure.reflect)

ホスト型の reflection 情報を Clojure データとして収集および構築するのに役立つ関数とプロトコルを提供します.

REPLユーティリティ (clojure.repl)

REPLでインタラクティブに使用することを目的としたユーティリティ。

集合と関係代数 (clojure.set)

関係代数を使用して数学的集合を操作、構築、およびクエリするのに役立つ関数。

文字列処理 (clojure.string)

文字列を操作するための関数。

ユニットテスト (clojure.test)

Clojureユニットテストフレームワーク。

データ構造のウォーキング (clojure.walk)

ネストされたデータ構造をトラバースおよび操作するためのユーティリティ。

XML (clojure.xml)

XMLデータの読み取りと書き込みのためのユーティリティ。

ジッパー - 関数型ツリー編集 (clojure.zip)

Clojure には、ジッパーと呼ばれる手法を使用した純粋に機能的な汎用ツリーウォーキングと編集が含まれています (名前空間 * **zip** * 内)。背景については、Huet による論文 を参照してください。ジッパーは、階層データ構造内の場所とその場所に至るまでのパスを表すデータ構造です。上下左右のナビゲーション、およびノードの局所的な関数型「編集」、挿入、削除を提供します。ジッパーを使用すると、ツリーを命令的に破壊的にウォークスルーするようなコードを記述し、完了したら root を呼び出して、実際には何も変更されていない場合にすべての変更を反映した新しいツリーを取得できます。すべてスレッドセーフで共有可能です。next 関数は深さ優先探索を実行するため、ループを理解しやすくなります

(def data '[[a * b] + [c * d]])
(def dz (zip/vector-zip data))

;find the second *
(-> dz zip/down zip/right zip/right zip/down zip/right zip/node)
-> *

;'remove' the first 2 terms
(-> dz zip/next zip/remove zip/next zip/remove zip/root)
-> <<c * d#,c * d>>


;'replace' * with /
(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]]


;'remove' *
(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]]


;original is intact
(zip/root dz)
-> [[a * b] + [c * d]]

ジッパーコンストラクターは、ネストされたseq、ネストされたベクター、および * **xml / parse** * によって生成されたxml要素に提供されます。他のデータ構造をサポートするには、4〜5行の関数だけで済みます。