2013-12-14 4 views

ответ

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, но все же актуально.

+0

спасибо большое! Я запутался в том, что '(= '[: a: b]' (: a: b))' возвращает 'true', потому что один из них является списком, другой - вектором. Хорошо, я должен сначала посмотреть «Когда использовать« цитату в Lisp ». – thinkerou

+1

«Равенство ... сравнивает числа и коллекции независимым от типа образом». http://clojuredocs.org/clojure_core/clojure.core/= –

+0

Просто добавьте к тому, что уже подразумевается в том, что amalloy и Диего Баш сказал: ThinkerOu, вы испытываете две биты гибкости в Clojure. (Эта гибкость чрезвычайно полезна, хотя это означает, что вы должны быть осторожны, чтобы гибкость не скрывала ошибок.) Во-первых, последовательности разных видов часто, по сути, автоматически принуждаются к другим типам последовательностей. Во-вторых, ключевые слова часто используются как ключи в Clojure 'maps', и из-за этого их можно рассматривать как функции. (В этом последнем вопросе есть больше.) Вот как я об этом думаю, хотя я также новичок в Clojure. – Mars

0

От The Joy Of Clojure 2nd Edition:

Идентичный? функция в Clojure только когда-либо возвращает истину, когда символы фактически тот же объект:

(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 
+0

Я думаю, что добавление метаданных может оставить фундаментальную точку менее ясной, чем могло бы быть. Другая иллюстрация: '(идентичный? [1 2 3] [1 2 3])' => 'false ', потому что первый и второй векторы представляют собой две разные структуры данных, построенные отдельно. – Mars

+0

справедливая точка, но я пытался привести соответствующую цитату по этим же строкам. –

Смежные вопросы