clojure - 如何在另一个文件中使用我项目中的一个文件?

标签 clojure

简单的问题。我是 Clojure 的新手。

如何在另一个文件中使用我项目中的一个文件?基本上我如何包含、导入或需要另一个文件?不是来自图书馆,而是来自我自己的代码。

谢谢,
亚历克斯

最佳答案

通常,您会希望使用与库代码相同的方法,即 use/require您的命名空间(通过文件顶部的 ns 表单,有时是 REPL 中的 use/require 函数)。为此,您必须确保它们在类路径上。一个简短的指南:

  • 遵循通常的 Clojure 项目结构:a src/包含所有源文件的目录,其中文件 src/foo/bar/baz.clj定义了一个名为 foo.bar.baz 的命名空间.请注意您必须维护目录结构/命名空间名称结构对应关系;否则事情就行不通了。另请注意,您不得使用 _命名空间名称中的字符或 -文件名中的字符(连字符)以及每当您使用 _在文件名中,您必须使用 -在命名空间名称中(反之亦然)。最后,Maven 项目的目录层次结构会稍微复杂一些,但现在不要担心(除非您已经是 Maven 的熟练用户,在这种情况下对你来说不会有问题)。
    另见 this answer of mine有关使用 Clojure 处理 Java 类路径的早期 SO 问题,以获取对文件系统层次结构/类路径层次结构对应关系的更详细的逐步说明。
  • 如果您的代码来自 foo.bar命名空间需要使用来自 foo.quux.baz 的代码命名空间,做类似 (ns foo.bar (:require [foo.quux.baz :as baz])) 的事情在 foo/bar.clj并从 baz 调用函数如 baz/some-function .或者你可以把 (:use foo.quux.baz)ns而是直接调用它们(没有命名空间限定符,例如 some-function )。这与您对库代码所做的完全相同。

  • 使用 REPL 中的项目代码时,请确保包含 src/目录(目录本身,而不是其中的任何文件)。 您可能应该考虑使用一些工具为您自动化 REPL 设置(包括类路径管理); Leiningen非常受 Clojurians 的欢迎,并且也有将 Maven 与 Clojure 一起使用的插件。
    警告:您的 JVM 启动命令可能(实际上,可能会)识别名为 $CLASSPATH 的环境变量。 .至于它和你的 Clojure 项目的关系,嗯,基本上应该没有。更有可能的是,您的项目每个都需要不同的类路径,其中一些可能使用与其他人所需的不兼容的某些 jar 版本(特别是如果您使用 Clojure 1.1——最新的稳定版本——对于某些项目,同时进行试验与其他人的 1.2 快照)。因此,管理类路径的正确方法是为每个项目准备一个最小版本并将其传递给 JVM 启动命令。如前所述,您应该花一些时间学习使用一个好的工具(如上面提到的 Leiningen)尽快为您设置类路径,这样您就不需要自己关心这个了。
    (作为旁注,在某些情况下,您可能需要添加的不仅仅是 src/ 目录和您的 jar s 到类路径,例如,如果您计划调用 compile 来生成 .class 文件,您'也必须将目标目录放在类路径上。不过,这超出了这个问题的范围。)
    顺便说一句,我已经用“正常”这个词开始了这个答案,因为你也可以使用像 load 这样的东西。 & in-ns将单个命名空间拆分为多个文件。不过,在大多数情况下,这并不是您真正想要做的;只需使用经过深思熟虑的命名空间布局即可。

    关于clojure - 如何在另一个文件中使用我项目中的一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459405/

    相关文章:

    regex - 用于突出显示 Lisp 函数调用中的函数引用的语法高亮规则

    clojure - Clojure当宏

    file-upload - 环形中间件不提取多部分参数

    clojure - 我应该如何构建一个列表并在 clojure 中返回它?

    sqlite - 在 Clojure 中通过 clojure.java.jdbc 使用外键约束

    design-patterns - 在Clojure中,如何更好地设计这段需要多态的代码?

    macros - 从 clojure 宏返回多个值

    clojure - 如何在 Clojure 中增加一个数字?

    java - 使用 java.bean API 检查非公共(public)类的实例

    python - 我从 clojure 和 python 中得到了稍微不同的 hmac 签名