Другие отметили, что #(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)