问题是关于not=
:
Clojure> (doc not=)
---------------------
Cloure.core/not=
([x] [x y] [x y & more])
Same as (not (= obj1 obj2))
Clojure> (not= [1 2 3] [1 2 3])
false
Clojure> (not= '(1 2 3) '(1 2 3))
false
Clojure> (not= #(1 2 3) #(1 2 3))
true
任何建议都表示赞赏!
答案 0 :(得分:14)
设置使用大括号
user=> (not= #(1 2 3) #(1 2 3))
true
user=> (not= #{1 2 3} #{1 2 3})
false
答案 1 :(得分:4)
仅供参考,#character是clojure reader中的"dispatch macro"。 它告诉读者特别对待它的表达。据我所知,它是 在clojure中定义的唯一读者宏。
#( )
定义一个函数。 (fn [< optional-args >] ...)
#" "
定义正则表达式#'
引用var it's self而不是var。#{ }
定义一个集合。#_
不读下一个声明。这就像一个超级评论,它更多的是通过评论,但区别并不常用。 答案 2 :(得分:1)
其他人评论说#(1 2 3)
不是一个集合,而是一个函数(在调用时会引发错误)。 #(1 2 3)
不等于#(1 2 3)
的原因是#(...)
的每次调用都会创建一个新的匿名函数,并且每个新函数都属于一个新的Java类:
user=> (class #(1 2 3))
user$eval60$fn__61
user=> (class #(1 2 3))
user$eval64$fn__65
这些类有一个equals
方法,它不会将其他类的对象视为相等,即使它们恰好以相同的方式定义。该方法实际上是继承自java.lang.Object
:
user=> (for [m (.getMethods (class #(1 2 3)))
:when (= (.getName m) "equals")]
(.getDeclaringClass m))
(java.lang.Object)