阐明 ns 在包中的使用

clarify use of ns in packages

昨天开始玩 Clojure。 我不知道模块系统是如何工作的:

  1. 我已经安装草书
  2. 我已经按照 leiningen 模板创建了一个项目
  3. 我在 /src/clojure_first_steps
  4. 下有两个 clojure 文件

core.clj

(ns clojure-first-steps.core)
(:require [clojure-first-steps.utils :refer :all])

(defn run-other-foo
  (foo-2 ["hello"]))

utils.clj

(ns clojure-first-steps.utils)

(defn foo-2 [x] (x)) 

虽然'lein compile'运行没有问题,'lein test'编译失败 (:require [clojure-first-steps.utils :refer :all]),测试是:

(ns clojure-first-steps.core-test
  (:require [clojure.test :refer :all]
            [clojure-first-steps.core :refer :all]))

(deftest a-test
  (testing "I can access dependecies from another module"
    (is (= "hello" (run-other-foo)))))

错误信息是java.lang.ClassNotFoundException: clojure-first-steps.utils

编辑:项目树

.
├── CHANGELOG.md
├── clojure_first_steps.iml
├── doc
│   └── intro.md
├── LICENSE
├── project.clj
├── README.md
├── resources
├── src
│   ├── clojure_first_steps
│   │   ├── core.clj
│   │   └── utils.clj
├── target
│   ├── classes
│   │   └── META-INF
│   │       └── maven
│   │           └── clojure_first_steps
│   │               └── clojure_first_steps
│   │                   └── pom.properties
│   ├── repl-port
│   └── stale
│       └── leiningen.core.classpath.extract-native-dependencies
└── test
    ├── clojure_first_steps
    │   └── core_test.clj

在你的core.clj中:

(ns clojure-first-steps.core) (:require [clojure-first-steps.utils :refer :all])

这是不正确的 - (:require) 子句需要在 ns 宏中。因为不是,所以查了vector中的符号(显然没有找到)。

(ns clojure-first-steps.core
  (:require [clojure-first-steps.utils :refer :all]))

这会告诉 Clojure 编译器加载 clojure-first-steps.utils(如果尚未加载),并在您新创建的命名空间中引用它的定义。