4

Common Lisp 在其核心库中有 700 多个函数。Clojure 的库中大约有多少个?

(“核心库”被定义为当您包含[org.clojure/clojure "1.5.1"]在您的中时您可以访问的所有内容project.clj

4

1 回答 1

12

(更新:受这个问题的启发,我发布了Varspotting,这是一个 Leiningen 插件和库,用于生成此类数据的报告。Clojure 1.5.1 的报告显示在自述文件中;有关数字,另请参阅下面的我的评论。这些计数与下面答案中的计数之间的微小差异是 REPL 环境的结果,包括 Varspotting 从其计数中省略的某些绑定。)

使用 Clojure 1.5.1。

clojure.core命名空间:

  1. 公共变量:

    (count (ns-publics 'clojure.core))
    ;= 591
    
  2. 包含非宏函数的公共变量(过滤函数旨在排除 6 个包含映射的变量,请参阅下文了解如何找到它们;此时没有要排除的集合或向量):

    (->> (ns-publics 'clojure.core)
         vals
         (filter #(not (.isMacro %)))
         (map deref)
         (filter (every-pred ifn? (comp not map?)))
         count)
    ;= 477
    
  3. 在上面#(.isMacro %)filter我们发现有 76 个公共宏。

  4. 可以使用以下代码段发现 32 个不包含类似函数值的公共变量:

    (->> (ns-publics 'clojure.core)
         vals
         (remove (comp ifn? deref)))
    
  5. 使用(filter (comp map? deref))而不是(remove ...)上面的来查找 6 个保存地图值的变量。

与 2. 相同,对于 Clojure jar 中的所有命名空间(跳过已弃用的clojure.parallel并另外排除两个保存向量的 Var;此时没有要排除的集合;希望没有遗漏任何其他内容):

(dorun (map require '[clojure.core clojure.data clojure.edn clojure.inspector
                      clojure.instant clojure.java.browse clojure.java.javadoc
                      clojure.java.io clojure.java.shell
                      clojure.main clojure.pprint clojure.reflect clojure.repl
                      clojure.set clojure.stacktrace clojure.string
                      clojure.template clojure.test clojure.walk clojure.xml
                      clojure.zip]))

(->> (mapcat ns-publics
             '[clojure.core
               clojure.data
               clojure.edn
               clojure.inspector
               clojure.instant
               clojure.java.browse
               clojure.java.javadoc
               clojure.java.io
               clojure.java.shell
               clojure.main
               clojure.pprint
               clojure.reflect
               clojure.repl
               clojure.set
               clojure.stacktrace
               clojure.string
               clojure.template
               clojure.test
               clojure.walk
               clojure.xml
               clojure.zip])
     vals
     (filter #(not (.isMacro %)))
     (map deref)
     (filter (every-pred ifn? (comp not map?) (comp not vector?)))
     count)
;= 676

对于宏,总数为 99。

于 2013-07-08T11:30:17.007 回答