我的背景包括 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)
这个错误似乎有点过分,因为根据我的想法,“声明”实际上是编译器的“绑定承诺”,而没有真正定义一个。
有什么想法吗?