我的背景包括 10 年的通用 lisp,所以现在我正在学习 Clojure,方法是编写一个符号数学包,其中包含命名空间中的向量(即 a、b、c)和 Nvector 绑定(ab、ac、bc 等),并定义了 print 方法对于这些对象。
因此,当我在绑定函数所在文件的底部编写我的 deftests 时,我必须编写(声明 ab ab)来避免编译器警告(这很有意义)。
    (def G3 (doall (ga-bindall "a b c")))
    galg.core=> G3
    (+a +b +c +a*b +a*c +b*c +a*b*c +a*b +a*c +b*c +a*b*c)
    galg.core=> [a +a -a ab +ab -ab a*b +a*b -a*b abc]
    [+a +a -a +a*b +a*b -a*b +a*b +a*b -a*b a*b*c]
    (deftest galg-vectors
      (declare a b ab)   ;<=== required when in same file as definitions
      (testing "GALG Vector, Nvector and Sum tests."
        (is (= (Vector 'a) a))
        (is (= (Vector 'a -1) -a))
        (is (= ab (Nvector 'a 'b)))
        (is (= (+ 1 a ab) (Sum 1 a ab)))
        ))
然后,当我通过将测试移至 galg.core-test 文件来清理代码时,如下所示:
    (ns galg.core-test (:use clojure.test galg.core))  ;;<== imports a, b, ab, etc
    (deftest galg-vectors
      ;(declare a b ab)   ;<=== must be removed when in separate file 
      (testing "GALG Vector, Nvector and Sum tests."
        (is (= (Vector 'a) a))
        (is (= (Vector 'a -1) -a))
        (is (= ab (Nvector 'a 'b)))
        (is (= (+ 1 a ab) (Sum 1 a ab)))
        ))
...然后,当 (declare ab ab) 存在时,“已经引用:”编译器错误发生:
CompilerException java.lang.IllegalStateException:a 已经引用:#'galg.core/a 在命名空间:galg.core-test,编译:(NO_SOURCE_PATH:2:3)
这个错误似乎有点过分,因为根据我的想法,“声明”实际上是编译器的“绑定承诺”,而没有真正定义一个。
有什么想法吗?