Common Lisp 在其核心库中有 700 多个函数。Clojure 的库中大约有多少个?
(“核心库”被定义为当您包含[org.clojure/clojure "1.5.1"]
在您的中时您可以访问的所有内容project.clj
)
Common Lisp 在其核心库中有 700 多个函数。Clojure 的库中大约有多少个?
(“核心库”被定义为当您包含[org.clojure/clojure "1.5.1"]
在您的中时您可以访问的所有内容project.clj
)
(更新:受这个问题的启发,我发布了Varspotting,这是一个 Leiningen 插件和库,用于生成此类数据的报告。Clojure 1.5.1 的报告显示在自述文件中;有关数字,另请参阅下面的我的评论。这些计数与下面答案中的计数之间的微小差异是 REPL 环境的结果,包括 Varspotting 从其计数中省略的某些绑定。)
使用 Clojure 1.5.1。
clojure.core
命名空间:
公共变量:
(count (ns-publics 'clojure.core))
;= 591
包含非宏函数的公共变量(过滤函数旨在排除 6 个包含映射的变量,请参阅下文了解如何找到它们;此时没有要排除的集合或向量):
(->> (ns-publics 'clojure.core)
vals
(filter #(not (.isMacro %)))
(map deref)
(filter (every-pred ifn? (comp not map?)))
count)
;= 477
在上面#(.isMacro %)
,filter
我们发现有 76 个公共宏。
可以使用以下代码段发现 32 个不包含类似函数值的公共变量:
(->> (ns-publics 'clojure.core)
vals
(remove (comp ifn? deref)))
使用(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。