Clojure

其他包含的函式庫

其他包含的函式庫

Java 工具(clojure.java.*)

clojure.java.io 包含由 Java 類別支援的 Clojure 多型 I/O 工具函式。

提供函式 javadoc,嘗試顯示類別或實例類別的適當 Javadoc。

提供 sh 函式,用於啟動和管理子程序。有關其預期引數的詳細資訊,請參閱函式文件。

平行處理(已棄用)

平行函式庫(parallel.clj 中的命名空間 parallel)封裝 ForkJoin 函式庫。此函式庫現已棄用。

基本概念是,Clojure 集合(以及效率最高的向量)可以使用 par 函式轉換為平行陣列,供此函式庫使用,儘管大多數函式會使用集合,並在需要時呼叫 par,因此通常您只需要明確呼叫 par 以附加 bound/filter/map 作業。

平行陣列支援在實現/計算之前附加界限、篩選器和對應函式,這是透過對陣列執行多個作業(pvec/psort/pfilter-nils/pfilter-dupes)的結果而發生的。與使用序列、對應和篩選器逐步執行複合作業不同,對應和篩選器會附加並因此透過提供作業給 par 來組合。請注意,附加作業的順序很敏感 - 界限在篩選器之前,篩選器在對應之前。然後,所有作業都會並行發生,使用多個執行緒和由 fork-join 支援的複雜工作竊取系統,無論是在陣列實現時,還是執行聚合作業(例如 preduce/pmin/pmax 等)時。

平行陣列可以使用 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)

提供有用的函數和協定,用於收集和建立主機類型反射資訊作為 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]]

提供巢狀序列、巢狀向量和 xml/parse 所產生的 XML 元素的拉鍊建構函數。只需一個 4-5 行的函數即可支援其他資料結構。