Fork me on GitHub
#clojure-russia
<
2017-10-22
>
y.khmelevskii00:10:57

подскажите, пожалуйста, как красивее сделать следующую трансформацию: есть два вектора

(def a [{:accent :milky}
        {:accent :salmon}
        {:accent :bostonBlue}])

(def b [:a :button])
нужно получить
[{:component :a :accent :milky}
   {:component :a :accent :salmon}
   {:component :a :accent :bostonBlue}
   {:component :button :accent :milky}
   {:component :button :accent :salmon}
   {:component :button :accent :bostonBlue}]
у меня получаются какие монстроидальные конструкции (

jahson02:10:53

(for [a1 a b1 b] (assoc a1 :component b1))

maxp04:10:30

@dottedmag - мы-то может где-то и троллим, но я про массы. Вот смотри яркий пример - @ivana. Что за чувак вообще не понятно, что полезного сделал за всю жизнь - тоже. Зато горазд рассуждать о вещах, о которых имеет очень поверхностное представление, причем, мыслеформ кроме "фигня" и "распил" особо не наблюдается.

dottedmag08:10:21

@maxp Это все необходимые признаки хорошего политолога — может бросать писание кода и начинать грести деньги лопатой.

y.khmelevskii09:10:53

@jahson что-то мне кажется это не об этом. Я могу сделать редьюс внутри которого мап в мапе. Но это жесть, как по мне

dottedmag10:10:16

@y.khmelevskii (for [b1 b a1 a] (assoc a1 :component b1)) даёт ровно тот результат, который ты запросил.

dottedmag10:10:47

Порядок в for изменён по сравнению с тем, что предложил @jahson

ilevd10:10:46

(for [b1 b a1 a] (assoc {} :component b1 :accent (:accent a1))) не верь им, делай так))

ilevd10:10:11

Даже так (vec (for [b1 b a1 a] (merge {:component b1} a1)))

dottedmag13:10:05

@ilevd Зачем assoc в пустую карту?

dottedmag13:10:31

Типа, чтобы мусор не приехал? Ну, да.

ilevd14:10:01

@dottedmag да не, там просто порядок получается другой, сначала :component, потом :accent как в запрошенном резалте 😀

ilevd14:10:41

(not= (map first (for [b1 b a1 a] (assoc {} :component b1 :accent (:accent a1))))
      (map first (for [b1 b a1 a] (assoc a1 :component b1))))

anjensan10:10:13

так ничего, что в хешах кложурных порядок не определен?

ilevd11:10:14

Ну вообще, конечно, это шутка была, но по факту:

(reduce (fn [m i] 
          (let [m* (assoc m i i)]
            (prn (type m*) m*)
            m*))
        {} (range 12))
clojure.lang.PersistentArrayMap {0 0}
clojure.lang.PersistentArrayMap {0 0, 1 1}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2, 3 3}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2, 3 3, 4 4}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2, 3 3, 4 4, 5 5}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7}
clojure.lang.PersistentArrayMap {0 0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 6, 7 7, 8 8}
clojure.lang.PersistentHashMap {0 0, 7 7, 1 1, 4 4, 6 6, 3 3, 2 2, 9 9, 5 5, 8 8}
clojure.lang.PersistentHashMap {0 0, 7 7, 1 1, 4 4, 6 6, 3 3, 2 2, 9 9, 5 5, 10 10, 8 8}
clojure.lang.PersistentHashMap {0 0, 7 7, 1 1, 4 4, 6 6, 3 3, 2 2, 11 11, 9 9, 5 5, 10 10, 8 8}
=> {0 0, 7 7, 1 1, 4 4, 6 6, 3 3, 2 2, 11 11, 9 9, 5 5, 10 10, 8 8}

ilevd11:10:24

Интересно, тут https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentArrayMap.java#L180-L181 опечатка и должно быть >= или специально сделано? Так как на деле получается 9 пар ключ-значений (не степень двойки), хотя HASHTABLE_THRESHOLD объявлен как 16

anjensan13:10:51

думаю опечатка

y.khmelevskii20:10:39

супер, спасибо! я не до конца понимал как работает for

dottedmag21:10:05

Интересно, насколько кложурный подход к стабильности отличается от мейнстримного. Я сегодня хотел добавить в Homebrew приложение, которое последний раз релизилось в 2006 (потому что в формате .djvu за последние 11 лет особых изменений не произошло), а там явным образом не принимают формулы для софта, который за последний год не выпустил ни одного релиза.

misha21:10:26

хипстера рубисты

ilevd11:10:24

Интересно, тут https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentArrayMap.java#L180-L181 опечатка и должно быть >= или специально сделано? Так как на деле получается 9 пар ключ-значений (не степень двойки), хотя HASHTABLE_THRESHOLD объявлен как 16