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?函数.
我认为'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()方法依赖于对这两个字符串进行身份检查,依赖于字符串实习.
| 归档时间: |
|
| 查看次数: |
735 次 |
| 最近记录: |