Clojure核心库中大约有多少个函数?

4
< p >Common Lisp核心库有700多个函数。Clojure的库中大约有多少个函数?< /p > < p >(其中“核心库”被定义为在您的< code > project.clj < /code >中包括< code > [org.clojure/clojure "1.5.1"] < /code >时可以访问的所有内容)< /p >
1个回答

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. Public Vars which hold non-macro functions (the filter function is meant to exclude the 6 Vars which hold maps, see below for how to find them; there are not sets or vectors to exclude at this time):

    (->> (ns-publics 'clojure.core)
         vals
         (filter #(not (.isMacro %)))
         (map deref)
         (filter (every-pred ifn? (comp not map?)))
         count)
    ;= 477
    
  3. With #(.isMacro %) in the filter above, we find there are 76 public macros.

  4. The 32 public Vars which do not hold function-like values can be discovered with this snippet:

    (->> (ns-publics 'clojure.core)
         vals
         (remove (comp ifn? deref)))
    
  5. Use (filter (comp map? deref)) instead of the (remove ...) in the above to find the 6 Vars holding map values.

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

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


这是一个很棒的答案。为了清晰起见,你的最终答案是回答676这个问题吗? - hawkeye
受到这个问题的启发,我发布了Varspotting,这是一个用于打印此类数据报告的Leiningen插件和库。对于Clojure 1.5.1内置的命名空间,报告的计数如下(这里,“proper”函数是由fn创建的函数,与可调用对象(如集合和映射)相对应):有831个公共变量,其中6个最初未绑定,39个标记为动态的(其中6个持有proper函数),658个持有proper函数,98个注册为宏,17个持有非proper可调用对象。 - Michał Marczyk
@amalloy:我考虑过这个问题,但我认为大多数都是实现细节,就像非公共变量一样。我可以为它们做一个单独的计数,我想。 - Michał Marczyk
哦,抱歉,我读错了jar文件名。是的,那会显著增加计数。 :-) - Michał Marczyk
1
抱歉,我之前评论中报告的计数有错误;正确的计数如下:844个公共函数(6个未绑定,39个动态函数,其中6个是适当的函数),670个适当的函数,99个宏,17个非函数可调用对象。 - Michał Marczyk
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接