作为clojure的新手,我正在尝试使用deftype定义具有可变字段的有效类,以下是我的定义。
我的程序是单线程的,没有人会使用我的代码,我保证。我知道不可变性的所有优点,但这个程序进行了超过5亿次更新,所以垃圾回收器将是主要演员,而不是我的代码。我已经尝试过。
我运行时遇到两个问题。
*1. ; Execution error (IllegalArgumentException) at layout.core.Individual/idivlCopy (core.clj:161).
; No matching field found: fitness for class layout.core.Individual
我明白deftype的字段不是公开的,但idivlCopy的代码在deftype本身中。对我来说,运行时似乎是知道(.fitness this),但不知道(.fitness that)。
- 这种行为的理由是什么?我该如何解决这个问题?
- 我该如何从私有(即deftype)代码区域访问私有受保护的字段(of that)?!
`
*2. ; Execution error (ClassCastException) at layout.core.Individual/idivlSwap (core.clj:173).
; class clojure.core.Vec cannot be cast to class clojure.lang.IEditableCollection
; (clojure.core.Vec and clojure.lang.IEditableCollection are in unnamed module of loader 'app')
`
- 注解说明这两个字段都是volatile-mutable。为什么染色体向量在运行时不知道这一点?为什么我不能(assoc! ) my volatile-mutable染色体向量-of :char -s?
(definterface IIndividual
(idivlCopy [that]) ; Copies that Individual to this
(idivlSwap [^Integer xP, ^Integer xQ])) ; Swaps two genes in the chromosome
; and somme more.
)
(deftype Individual ; An individual has a fitness value and a chromosome
[^{:volatile-mutable true} ^Integer fitness, ; Integer
^{:volatile-mutable true} chromosome] ; vector-of :char
IIndividual
:
.
(idivlCopy ; Copies that Individual to this
[_, that]
*1 (set! fitness (.fitness that)) ; (set! fitness 999) worked!!
(set! chromosome (.chromosome that))
nil)
(idivlSwap ; Swaps the genes in the chromosome at alleles P and Q
[this,
^Integer iP, ; index of allele P
^Integer iQ] ; index of allele Q
(let [gP (chromosome iP), ; gene at allele P
gQ (chromosome iQ)] ; gene at allele Q
*2 (assoc! chromosome iP gQ)
(assoc! chromosome iQ gP)
nil))
; and some more
:
.
)