=> (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))
В итоге самое короткое получается)