Clojure核心库中有多少函数?

时间:2013-07-08 10:57:11

标签: function clojure common-lisp

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

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

1 个答案:

答案 0 :(得分:12)

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

使用Clojure 1.5.1。

clojure.core命名空间:

  1. Public Vars:

    (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个Vars,保存地图值。

  6. 与Clojure jar中的所有名称空间相同(跳过已弃用的clojure.parallel并另外排除两个Vars保持向量;此时没有要排除的集合;希望没有错过任何其他内容) :

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