Clojure

其他包含的库

其他包含的库

Java 工具 (clojure.java.*)

clojure.java.io 包含基于 Java 类的 Clojure 多态 I/O 工具函数。

提供函数 javadoc,用于尝试显示类或实例类的相应 Javadoc。

提供一个 sh 函数,用于简化子进程的启动和管理。有关其预期参数的详细信息,请参阅函数文档。

并行处理 (已弃用)

并行库(命名空间 parallel,在 parallel.clj 中)封装了 ForkJoin 库。此库现已弃用。

基本思想是,Clojure 集合(最有效的是向量)可以转换为并行数组,供此库使用函数 par 使用,尽管大多数函数都接受集合并将在需要时调用 par,因此通常您只需要显式调用 par 才能附加绑定/筛选/映射操作。

并行数组支持在实现/计算之前附加边界、筛选器和映射函数,这些操作是作为对数组的多个操作(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 数据的工具。

Zipper - 函数式树编辑 (clojure.zip)

Clojure 包含纯函数式、通用树遍历和编辑,使用一种称为 Zipper 的技术(在命名空间 zip 中)。有关背景信息,请参阅 Huet 的论文。Zipper 是一种数据结构,表示层次数据结构中的位置以及到达该位置的路径。它提供向下/向上/向左/向右导航以及节点的本地化函数式“编辑”、插入和删除。使用 Zipper,您可以编写看起来像命令式、破坏性树遍历的代码,在完成时调用 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]]

Zipper 构造函数为嵌套 seq、嵌套向量以及 xml/parse 生成的 xml 元素提供支持。只需一个 4-5 行的函数即可支持其他数据结构。