私のバックグラウンドには 10 年間の Common Lisp が含まれているため、今は名前空間にベクトル (つまり a、b、c) と Nvector バインディング (ab、ac、bc など) を含むシンボリック数学パッケージを作成し、print メソッドを定義して Clojure を学んでいます。これらのオブジェクトのために。
そのため、バインド関数と同じファイルの末尾に 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 already refer to: #'galg.core/a in namespace: galg.core-test, compiling:(NO_SOURCE_PATH:2:3)
私の考えでは、「宣言」は実際にはコンパイラーの「バインディングの約束」であり、実際には定義していないため、このエラーは少し過剰に思えます。
何かご意見は?