Size: a a a

Clojure — русскоговорящее сообщество

2021 October 26

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
изящного не увидел
источник

ND

Nikita Domnickij in Clojure — русскоговорящее сообщество
(loop [acc []
      [a & arest] [:qoo :boo :moo]
      [b & brest] [:q :b]]
 (if-not (or a b)
   acc
   (recur (conj acc (or (and a b [a b]) a b))
          arest
          brest)))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
как вариант:

(defn foo-moo [foo moo]
 (loop [acc []
        [a & arest] foo
        [b & brest] moo]

   (cond
     (and a b)
     (recur (conj acc [a b]) arest brest)

     (or a b)
     (recur (conj acc (or a b)) arest brest)

     :else
     acc)))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
если только map научить не останавливаться
(defn map2
 ([f c1 c2]
  (lazy-seq
    (let [s1 (seq c1) s2 (seq c2)]
      (when (or s1 s2)
        (cons (cond (and s1 s2) (f (first s1) (first s2))
                    s1 (first s1)
                    s2 (first s2))
              (map2 f (rest s1) (rest s2))))))))
=> #'user.repl/map2
(map2 vector [:qoo :boo :moo] [:q :b 2 3])
=> ([:qoo :q] [:boo :b] [:moo 2] 3)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
вот такое ещё в голову пришло
(let [a [:qoo :boo :moo]
     b [:q :b]
     [a1 a2] (split-at (count b) a)
     [b1 b2] (split-at (count a) b)]
 (into [] (concat (map vector a1 b1) a2 b2)))
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Такое придумал:
(defn interleave-all [coll-a coll-b]
   (if (seq coll-a)
     (lazy-seq
       (cons (first coll-a)
             (interleave-all coll-b (rest coll-a))))
     coll-b))
Грубо, на каждом шаге брать очередной элемент из первой и в рекурсивном вызове менять коллекции местами, пока не получим пустую коллекцию в первом аргументе — тогда оставшийся хвост второй можно вернуть как есть.
источник

E

ETL in Clojure — русскоговорящее сообщество
о, вот это особенно хорошо, краткость - сестра таланта )
учитывая ещё и то, что a на самом деле - a никогда не короче b, короче может быть только b
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну тогда как-то так
(let [a [:qoo :boo :moo]
     b [:q :b]
     [a1 a2] (split-at (count b) a)]
 (into (mapv vector a1 b) a2))
источник

ИИ

Искандер Искаков... in Clojure — русскоговорящее сообщество
А я говорил)
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
как по мне, split-at тут явно лишний. Он и тяжелый очень
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
там же под капотом [(take n coll) (drop n coll)]
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
вот и получилось красивое
(let [a [:qoo :boo :moo]
     b [:q :b]]
 (into (mapv vector a b) (drop (count b) a)))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
вот эта кракозябра получается такая же быстрая, как loop от Ивана
(let [a [:qoo :boo :moo]
     b [:q :b]]
 (->> a (into [] (map-indexed (fn [i x] (if-let [y (get b i)] [x y] x))))))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
  ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
 (let [a [:qoo :boo :moo]
     b [:q :b]]
 (into (mapv vector a b) (drop (count b) a)))
 ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
 )
Evaluation count : 372606 in 6 samples of 62101 calls.
            Execution time mean : 1,470864 µs
   Execution time std-deviation : 56,910541 ns
  Execution time lower quantile : 1,405616 µs ( 2,5%)
  Execution time upper quantile : 1,542725 µs (97,5%)
                  Overhead used : 8,155308 ns

 ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
 (let [a [:qoo :boo :moo]
     b [:q :b]]
 (->> a (into [] (map-indexed (fn [i x]
                                (if-let [y (.valAt b i)]
                                  [x y]
                                  x))))))
 ;•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
 )
Evaluation count : 2017236 in 6 samples of 336206 calls.
            Execution time mean : 324,780651 ns
   Execution time std-deviation : 42,653861 ns
  Execution time lower quantile : 292,930337 ns ( 2,5%)
  Execution time upper quantile : 397,782608 ns (97,5%)
                  Overhead used : 8,155308 ns
источник

AG

Anton Gorobets in Clojure — русскоговорящее сообщество
Снова вопрос бабашководам.

Есть проект project/. В котором лежит bb.edn и config.edn. И есть в проекте модули /modules/module-1 в которых лежат bb.edn.

Хочется все конфиги хранить в одном config.edn. Но в каждой бабашке каждого модуля не хочется делать
(def config (read-config "../../config.edn"))
источник

AG

Anton Gorobets in Clojure — русскоговорящее сообщество
Может кто-то сталкивался с подобной структурой и какое-то красивое решение использовал
источник

IS

Ilshat Sultanov in Clojure — русскоговорящее сообщество
а в корне проекта тоже bb.edn есть?
источник

IS

Ilshat Sultanov in Clojure — русскоговорящее сообщество
а не так прочитал) понял
источник

AG

Anton Gorobets in Clojure — русскоговорящее сообщество
Да
источник

IS

Ilshat Sultanov in Clojure — русскоговорящее сообщество
я делал так - в корне читаешь конфиг - готовишь необходимые данные для того или иного модуля и при вызове команды в модуле прокидываешь через extra-env
источник