在clojure中,是(='a'a)指的是'同一个原子'?

haw*_*eye 6 lisp java scheme clojure

在Common LISP的一些实现中,我们可以说对于以下表达式

(eq 'a 'a)
Run Code Online (Sandbox Code Playgroud)

true因为'a并且'a是"同一原子".

这可能是依赖于实现的,但似乎短语(在流行的LISP教学书中使用)假设相同值的原子存储在存储器中的相同位置.

在Java中,两个具有相同值的实习字符串存储在内存中的相同位置.

现在JVM上的Clojure继承了Java的遗产,但是说Clojure中的两个原子(在JVM上)具有相同的值是同一个原子吗?(即Clojure的原子存储机制如何工作?)

Stu*_*rra 20

首先,"atom"在Clojure中具有与大多数其他Lisp不同的含义.见http://clojure.org/atoms

Clojure的=功能使用基于价值的平等.因此,两个具有相同值的对象=即使存储在内存中的不同位置也是如此.

要测试两个对象是否实际上是同一个对象,请在内存中的相同地址处使用该identical?函数.


Ale*_*ler 6

我认为'a和'a将成为不同的Java对象.我相信这证实了这种怀疑:

user> (def foo 5)
#'user/foo
user> (System/identityHashCode 'foo)
578999228
user> (System/identityHashCode 'foo)
1724482638
Run Code Online (Sandbox Code Playgroud)

如果你看一下Clojure 中Symbol的实际实现,你会发现一个符号由命名空间和一个名字组成,那些字符串必须是实习字符串.Symbol.equals()方法依赖于对这两个字符串进行身份检查,依赖于字符串实习.