clojure-russia 2018-07-31

=> (let [a [:a0 nil :a1 nil]
         b [:b0 :b1]]
    (foo a b))
[:b0 nil :b1 nil]
Есть у нас в стандарных либах такая foo? Или может есть идеи как можно без костылей элегантно напсать такую foo?

(defn foo [a b] (->> a (rest) (take-nth 2) (interleave b) (vec)))

@kgofhedgehogs хотя подозреваю, что нужно что-то вроде https://clojuredocs.org/clojure.set/rename-keys

Не, это не ренейм кейс. Я поставил киворды просто как пример элементов вектора

Твоя функция работает с предложенным мной примером, но мой пример оказался корнеркейсом, извиняюсь

Сейчас покажу новый пример и функцию написанную через луп для однозначности вопроса

@anjensan, вот я обновил пример

т.е. заменить все not nil из первой последовательности на элементы из второй

ну готовое такое врядли будет

@anjensan Да. Именно так

Т.е. могу так луп и оставлять?

в принципе почему нет. можно конечно через встроенные выразить. только будет не намного меньше и медленнее

ну если исходные списки не оч большие и не нужна ленивость

Исходный xs длиной до 10, ys соответственно <= 10

ну знач не нужна 😃

Ладно, оставляю loop. Спасибо

Теперь вопрос как же назвать такую функцию...

replace-not-nils-with-ys

(defn foo [a b]
  (let [r (filter some? a)
        r (into {} (map vector r b))]
    (replace r a)))

@ilevd могут случиться коллизии среди a и тогда потеряются некоторые b?

Сейчас подумаю могут ли у меня быть коллизии

если в y не может быть nil можно

по идее так должно работать всегда

тестировать лень 😉

В y не может быть nil

И коллизий в x тоже не может быть

ну тогда можешь решение от ilevd юзать. только (into [} (map vector r b) ==> (zipmap (remove nil? x) y)

(defn foo [a b] (replace (zipmap (remove nil? a) b) a))

В итоге самое короткое получается)

👍 2