在Clojure中,(= [:a :b] (list :a :b))
返回true
,但(= [:a :b] (:a :b))
返回false
。为什么呢?
我认为(list :a :b)
是(:a :b)
,所以所有人都不应该返回true
。
答案 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