2

テストしようとしている次のレコードタイプがあります。

(defrecord FirstOrderState [datum matrix]
  State
  ;; implementation goes here ...
  )

上記のタイプに基づいて分岐しようとしていますが、必要な結果が得られません

(def state (->FirstOrderState datum matrix))

(= (type state) composer.algorithm.markov.state.FirstOrderState)
=> false

ただし、のタイプを見ると、state一致する必要があることが確認されます。

(type state)
=> composer.algorithm.markov.state.FirstOrderState

true同様のチェックの結果が次のようになるため、これは機能するはずです。

(= (type []) clojure.lang.PersistentVector)
=> true

ここで私が見逃しているのは何ですか?以下のハックを使用すると解決策が得られますが、あまりエレガントではありません。

(= (str (type state)) (str composer.algorithm.markov.state.FirstOrderState))
=> true
4

1 に答える 1

4

私の最初の推測では、レコード型の定義を含む名前空間をリロードし、それstate別の場所 (おそらく REPL で) に定義されているため、作成composer.algorithm.markov.state.FirstOrderState時に使用されていたクラスとは異なるクラスを参照しているということです。 state.

REPL でのデモ:

user=> (defrecord Foo [])
user.Foo
user=> (def foo (->Foo))
#'user/foo
user=> (= (type foo) Foo)
true
user=> (defrecord Foo [])
user.Foo
user=> (= (type foo) Foo)
false
于 2013-12-04T04:23:34.460 に答える