在clojure中,相同的确切行为是什么?

时间:2014-12-14 10:05:11

标签: clojure sequence identity lazy-sequences

我对identical?clojure的行为感到非常惊讶。

(def a (map identity [:a :b])) (identical? (rest a) (rest a)); false

知道为什么identical?会返回false?

2 个答案:

答案 0 :(得分:5)

identical?

Tests if 2 arguments are the same object

由于rest在每次调用时都会创建一个新的seq对象,因此其结果不是identical?。但是,以下是:

(def r (rest (map identity [:a :b])))
(identical? r r) ;; => true

更新:正如@mfikes指出的那样,rest并不总是会创建新的seq。它在内部调用ISeq.more(),这是按照seq类型实现的,可能会对列表,向量,惰性seq等产生不同的结果:

(->> [(map identity [:a :b])
      (vector :a :b)
      (list :a :b)]
     (map #(identical? (rest %) (rest %))))
;; => [false false true]

答案 1 :(得分:2)

identical?是对象相等谓词。如果其参数是相同的对象/原语,则返回true。

使用=而不是identical?

当语义依赖于指针相等性时,

identical?是正确的工具,例如测试文件结束的标记值。

永远不要使用identical?来比较Clojure数据结构。即使关键字也不能保证identical?行为正确。