澄清在包中使用ns

时间:2016-04-03 12:13:06

标签: clojure packages require

昨天开始和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'在没有probs的情况下运行,但'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
    

1 个答案:

答案 0 :(得分:2)

在你的core.clj中:

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

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

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

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