你能在 Clojure 中看到一个原子以前的值吗?
Can you see previous values for an atom in Clojure?
“Clojure 形而上学将身份解释为我们人类强加给进程随时间产生的一系列不变值的东西”。
如果这是真的,如果身份涵盖所有这些状态,那么我应该可以做这样的事情。
user=> (def wow (atom 1))
#'user/wow
user=> (swap! wow (fn [cur] "You say 'Hello'."))
"You say 'Hello'."
user=> (swap! wow (fn [cur] "I say 'Goodbye'."))
"I say 'Goodbye'."
user=> (swap! wow (fn [cur] "Hello, hello!"))
"Hello, hello!"
; Can I do this?
user=> (get-old-atom-state wow 0)
1
(get-old-atom-state wow 1)
"You say 'Hello'"
是这样吗?或者,如果旧值未被使用,Clojure 是否真的对旧值进行 GC?
If this is true, if identity surronds all these states, then I should be able to do something like this.
从哲学上讲,我真的看不出这个“应该”有任何理由。 “Aaron Bell”是一个包含你过去所处的许多状态的身份,但我无法与任何过去的状态互动,甚至无法观察。我要了解其中任何一个的唯一方法是是否有人观察过它们并将这些观察结果写在我可以参考的某个不可变对象中。
Clojure 的身份以同样的方式运行:您可以随时拍摄快照,拍完之后,您可以随时查看该快照。但是没有人看过的状态永远消失了。
JVM 会垃圾收集原子的旧值和未引用值。
但是,您可以set up a listener 更改原子值并将旧值手动存储到另一个原子。
user=> (def wow (atom 1))
#'user/wow
user=> (def wow-history (atom ()))
#'user/wow-history
user=> (add-watch wow :hist
(fn [_ _ old _] (swap! wow-history conj old)))
突变原子:
user=> (swap! wow (fn [cur] "You say 'Hello'."))
"You say 'Hello'."
user=> (swap! wow (fn [cur] "I say 'Goodbye'."))
"I say 'Goodbye'."
user=> (swap! wow (fn [cur] "Hello, hello!"))
"Hello, hello!"
现在让我们检查历史记录中的值:
user=> @wow-history
("I say 'Goodbye'." "You say 'Hello'." 1)
当您不需要旧值以防止内存泄漏时,请不要忘记清理 wow-history
原子。
user=> (reset! wow-history ())
()
“Clojure 形而上学将身份解释为我们人类强加给进程随时间产生的一系列不变值的东西”。
如果这是真的,如果身份涵盖所有这些状态,那么我应该可以做这样的事情。
user=> (def wow (atom 1))
#'user/wow
user=> (swap! wow (fn [cur] "You say 'Hello'."))
"You say 'Hello'."
user=> (swap! wow (fn [cur] "I say 'Goodbye'."))
"I say 'Goodbye'."
user=> (swap! wow (fn [cur] "Hello, hello!"))
"Hello, hello!"
; Can I do this?
user=> (get-old-atom-state wow 0)
1
(get-old-atom-state wow 1)
"You say 'Hello'"
是这样吗?或者,如果旧值未被使用,Clojure 是否真的对旧值进行 GC?
If this is true, if identity surronds all these states, then I should be able to do something like this.
从哲学上讲,我真的看不出这个“应该”有任何理由。 “Aaron Bell”是一个包含你过去所处的许多状态的身份,但我无法与任何过去的状态互动,甚至无法观察。我要了解其中任何一个的唯一方法是是否有人观察过它们并将这些观察结果写在我可以参考的某个不可变对象中。
Clojure 的身份以同样的方式运行:您可以随时拍摄快照,拍完之后,您可以随时查看该快照。但是没有人看过的状态永远消失了。
JVM 会垃圾收集原子的旧值和未引用值。
但是,您可以set up a listener 更改原子值并将旧值手动存储到另一个原子。
user=> (def wow (atom 1))
#'user/wow
user=> (def wow-history (atom ()))
#'user/wow-history
user=> (add-watch wow :hist
(fn [_ _ old _] (swap! wow-history conj old)))
突变原子:
user=> (swap! wow (fn [cur] "You say 'Hello'."))
"You say 'Hello'."
user=> (swap! wow (fn [cur] "I say 'Goodbye'."))
"I say 'Goodbye'."
user=> (swap! wow (fn [cur] "Hello, hello!"))
"Hello, hello!"
现在让我们检查历史记录中的值:
user=> @wow-history
("I say 'Goodbye'." "You say 'Hello'." 1)
当您不需要旧值以防止内存泄漏时,请不要忘记清理 wow-history
原子。
user=> (reset! wow-history ())
()