微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让 Clojure 使用多个库? Clojure 相当于 Java 中的 folder.* 是什么?

如何解决如何让 Clojure 使用多个库? Clojure 相当于 Java 中的 folder.* 是什么?

我很好奇如何将多个文件作为更大文件夹系统的一部分导入?

假设我正在使用 leiningen 并且我在我的 project.clj 文件中提供了 :dependencies 关键字,并为 leiningen 找到我的库提供了正确的参数。我知道我可以简单地为我的源文件提供“(:use [folder.file])”,并且当我从中调用函数时它会知道引用该特定文件,但是我如何让它为所有人做到这一点那个文件夹里的文件? Clojure 使用“file.*”在 Java 中执行此操作的方式是什么?

解决方法

Clojure 没有命名空间的通配符要求(也没有 Java 类的通配符导入)。在 Clojure 中它真的没有必要,因为命名空间往往是相当大的、相关函数的扁平集合——因为我们没有像 Java 这样的类,我们没有成千上万的文件。

在工作中,我们有一个非常大的 Clojure 代码库:113k 行。它是这样分解的:

Clojure source 361 files 89724 total loc,3557 fns,939 of which are private,570 vars,30 macros,90 atoms,85 agents,24 protocols,67 records,858 specs,33 function specs.
Clojure tests 379 files 23795 total loc,4 specs,1 function specs.

所以平均源命名空间是 ~250 行,其中有 ~10 个函数。我们有一些命名空间超过 1,000 行(还有一个超过 2,000 行)。一些命名空间需要“很多”其他命名空间,但这非常罕见:我想说我们的大多数命名空间只引入了大约六个命名空间。

Clojure 命名空间中也没有层次结构。项目通常为其命名空间采用唯一前缀,例如 next.jdbc 代表最流行的 JDBC 库,即使它具有“子命名空间”,例如 next.jdbc.connection 这只是另一个分组-- 没有嵌套或分组的语义。

,

Clojure 明确的“要求”带来了一些好处。意图很明确,效果不太容易受到未来添加到目录的影响,您无需工具即可更轻松地进行重构,并且如果您使用工具,您将获得更多切合主题的实时打字建议。

但是“require”肯定不是将符号引入命名空间的唯一方法!命名空间是开放的;你可能适合自己。例如:Zach Tellman 的“potemkin”库 (https://github.com/clj-commons/potemkin) 可以将来自多个命名空间的符号融合为一个可以被要求的符号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。