2

我想改变代码的正常行为

(def a 5)
(def b a)
(def a 1)
b
5

对于这种行为

(def a 5)
(*something* b a)
(def a 1)
b
1

这只是为了学习目的,所以请不要尝试任何深刻的意义。

4

2 回答 2

8

作为对 Jared314 答案的补充,我想指出,如果您将a自己设为原子或引用,b将自动成为指针或引用a

(def a (atom 5))
(def b a)
@b ;=> 5
(reset! a 1)
@b ;=> 1
于 2013-09-19T10:15:29.583 回答
4

当您重新定义 时,您不会像在另一种语言a中那样更改 的值。将其视为常数a可能会更好。a您创建了一个新的a. 这是 Clojure 设计理念的一部分。

如果您想要指针之类的东西,请查看refsatom

原子:

(def a 5)
(def b (atom a))
@b ;=> 5
(def a 1)
@b ;=> 5
(reset! b a)
@b ;=> 1

参考:

(def a 5)
(def b (ref a))
@b ;=> 5
(def a 1)
@b ;=> 5
(dosync
 (ref-set b a))
@b ;=> 1

注意:用于@取消引用b. 它是deref函数的简写,是获取 的值所必需的b

于 2013-09-19T08:31:24.940 回答