Clojure 和 leiningen:声明和要求命名空间

Clojure and leiningen: declare and require namespace

我正在尝试了解如何通过 lein 声明和要求命名空间。我创建了一个项目 "interview",在 "src/interview" 中我有一个名为 "prompts" 的文件夹,它有一个名为 rawlist.clj:

的文件
+ /interview               project root
|--+ /src                  lein src
|  |--+ /interview
|     |--+ core.clj
|     |--+ /prompts        my new folder
|        |--+ rawlist.clj

rawlist.clj 文件:

(ns interview.prompts.rawlist)
;...

问题:

  1. 如何在 repl 中要求 rawlist?
    • 我正在尝试(require 'interview.prompts.rawlist)
  2. 如何要求使用rawlist的一些功能?
  3. 如何正确地为此创建一个测试文件夹?

clojure docs for require。这是一个示例,其中为命名空间指定了别名 r,以便您可以缩短名称。

(require [interview.prompts.rawlist :as r])
(r/your-function)

您也可以随时参考全名:

(interview.prompts.rawlist/another-fn)

require 有多种使用方式,例如如果您不想要前缀,请参考。假设你有 3 个函数 f1,f2,f3,那么你可以通过以下方式引用它们:

(require [interview.prompts.rawlist :refer [f1 f2] :as r)
(f1)
(f2)
(r/f3)

注意第三种情况,因为它不在引用列表中,所以你必须使用r前缀。

对于测试文件夹,请阅读documentation for leiningen那里的解释,但基本上可以归结为:

+ /interview
|--+ src/
|--+ test/

并且子文件夹结构遵循与 src 目录完全相同的模式。

您可以在 project.clj 中使用主项目宏中的 :source-paths:test-paths 键添加其他文件夹。有关详细信息,请参阅 the sample project

我建议您吸收上面示例项目中的所有内容,并阅读 leiningen tutorial

最后,当在其他来源(例如在您的测试中)引用 ns declaration 中的函数时,您使用相同的格式,但使用 :require 形式:

(ns foo.bar
  (:require [interview.prompts.rawlist :as r]))

(r/foo-fn)