(= [:a:b](list:a:b))在clojure中返回true?

时间:2013-12-14 02:02:40

标签: clojure

在Clojure中,(= [:a :b] (list :a :b))返回true,但(= [:a :b] (:a :b))返回false。为什么呢?

我认为(list :a :b)(:a :b),所以所有人都不应该返回true

2 个答案:

答案 0 :(得分:7)

(f x)要求使用参数f调用函数x。因此,(:a :b):a作为函数调用,其中:b为其参数。实际上做的事情目前并不是非常重要,但它肯定不会以(:a :b)的方式返回列表(list :a :b)。如果您希望将列表视为数据结构而不是函数调用,则可以quote通过(quote (:a :b))。要详细了解引用的内容,您可以阅读When to use 'quote in Lisp - 它不是特定于Clojure,但仍然相关。

答案 1 :(得分:0)

来自The Joy Of Clojure 2nd Edition

  

相同? Clojure中的函数只有在返回时才会返回true   符号实际上是同一个对象:

(let [x (with-meta 'goat {:ornery true})
      y (with-meta 'goat {:ornery false})]
  [(= x y)
   (identical? x y)
   (meta x)
   (meta y)])
;=> [true false {:ornery true} {:ornery false}]

等于(=)比较对象的内容(不比较元数据,如上所示),相同?只有当它们是同一个对象时才为真:

(let [x 'goat, y x]
  (identical? x y))
;=> true