0

考虑以下 leiningen 项目core.clj文件

(ns records.core)

(defn hello []  "hello")

(defprotocol my-sequence
  (add [seqq item]))

(defrecord my-vector [coll]
  my-sequence
  (add [_ item] (conj coll item)))

我可以编译它并在 REPL 中测试它,如下所示:

records.core> (hello)
"hello"
records.core> (add (my-vector. []) 42)
[42]

但是,当我将其转录到 leiningen 单元测试文件中时,如下所示:

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

(deftest a-test
  (testing "adding to a my-vector"
    (is (= (hello) "hello"))
    #_(is (= [42] (add (my-vector. []) 42)))))

第一个测试成功,表明符号hello已正确移动到records.core-test命名空间,但测试my-vector抛出编译器错误(删除#_上面第二行的):

clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException: 
Unable to resolve classname: my-vector, compiling:  
(.../records/test/records/core_test.clj:8:22)

这似乎不是这个 SO 问题的重复,因为我正在使用requireand refer,正如该问题的答案所建议的那样。

编辑:以下也无济于事

(add (records.core/my-vector. []) 42)
(add (#'records.core/my-vector. []) 42)
(add (@#'records.core/my-vector. []) 42)
4

1 回答 1

1

除非我的 defrecord 技能生疏了,否则你应该先要求命名空间,然后再导入 defrecord。

(:require records.core)
(:import [records.core my-vector])
于 2013-09-01T17:58:25.793 回答