В чем разница между set и ha sh -set в Clojure? - PullRequest
3 голосов
/ 08 мая 2020

Я не могу найти объяснения ни в документации, ни в Интернете, почему есть две разные функции, которые, кажется, делают практически одно и то же, кроме принятия одной коллекции, а другой списка аргументов (но это можно легко решить с помощью (apply hash-set coll)).

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Это просто для удобства. То же самое с vector против vec. Однако он не полностью параллелен для карт и списков:

(vector 0 1 2)            => [0 1 2]
(apply vector (range 3))  => [0 1 2]
(vec (range 3))           => [0 1 2]

(hash-set 0 1 2)            => #{0 1 2}
(apply hash-set (range 3))  => #{0 1 2}
(set (range 3))             => #{0 1 2}

(hash-map :a 1 :b 2)          => {:b 2, :a 1}
(apply hash-map [:a 1 :b 2])  => {:b 2, :a 1}
(into {} [[:a 1] [:b 2]])     => {:a 1, :b 2}

(list 0 1 2)            => (0 1 2)
(apply list (range 3))  => (0 1 2)
(into (list) (range 3)) => (2 1 0)  ; *** reversed order ***
1 голос
/ 17 мая 2020

Поскольку мы можем определить каждое в терминах другого:

(defn hash-set [& args]
  (clojure.core/set args))

или

(defn set [coll]
  (apply clojure.core/hash-set coll))

... вполне вероятно, что оба определены отдельно для скорости.

1 голос
/ 08 мая 2020

Только что проверил исходный код для set и hash-set. Вы правы в том, что разницы практически нет, кроме того, что один принимает несколько аргументов, а другой принимает коллекцию.

Вот, кстати, источник:

For set

Для га sh -набор

...