Clojure核心库中有多少函数?

haw*_*eye 3 function clojure common-lisp

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

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

Mic*_*zyk 12

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

使用Clojure 1.5.1.

clojure.core命名空间:

  1. 公共场合:

    (count (ns-publics 'clojure.core))
    ;= 591
    
    Run Code Online (Sandbox Code Playgroud)
  2. 保存非宏函数的公共变量(过滤函数用于排除保存地图的6个变量,请参见下文,了解如何找到它们;此时没有要排除的集合或向量):

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

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

    (->> (ns-publics 'clojure.core)
         vals
         (remove (comp ifn? deref)))
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用(filter (comp map? deref))而不是(remove ...)上面的内容来查找6个Vars保存地图值.

与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
Run Code Online (Sandbox Code Playgroud)

对于宏,总计数为99.