Почему два набора не равны? - PullRequest
       2

Почему два набора не равны?

2 голосов
/ 06 сентября 2011

Вопрос о 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

Любое предложение приветствуется!

Ответы [ 3 ]

14 голосов
/ 06 сентября 2011

Наборы используют брекеты

user=> (not= #(1 2 3) #(1 2 3))
true
user=> (not= #{1 2 3} #{1 2 3})    
false
4 голосов
/ 06 сентября 2011

просто для справки: символ # - это «макрос отправки» в считывателе clojure. это говорит читателю, чтобы относиться к выражению, сопровождающему это особенно. Насколько я знаю это единственный макрос для чтения, определенный в clojure.

  • #( ) определить функцию. сокращение от (fn [< optional-args >] ...)
  • #" " определить регулярное выражение
  • #' ссылка на переменную сама по себе вместо значения в переменной.
  • #{ } определить набор.
  • #_ не читать следующее утверждение. это похоже на супер комментарий, он более сквозной, чем комментарий, но это различие обычно не используется.
1 голос
/ 07 сентября 2011

Другие отметили, что #(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...