Size: a a a

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

2020 January 25

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
наверное поэтому в коммон-лиспе есть мап-реверсед если порядок результата не важен
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
про диссок-ин интересно, это из какого ресурса?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey Ivanov
про диссок-ин интересно, это из какого ресурса?
это из Clojure The Essential Reference от Renzo Borgatti
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
ага, пасиб
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
это из Clojure The Essential Reference от Renzo Borgatti
я уже пару раз ссылку на эту книгу здесь давал, поэтому боюсь показаться назойливым 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
мне сегодня ещё вот этот пассаж понравился
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
я не мониторил активно этот чат, так что меня эта ссылка обошла стороной раньше )
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
ЗЫ: мне не чуждо понимание причин наличия в стандартной либе комбинированных функций для оптимизации, я же писал стандартную либу к своему лиспу и сталкивался с теми же проблемами ) https://github.com/Ivana-/Liscript-Python/blob/master/standard_library.liscript#L141
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Sergey Trofimov
мне сегодня ещё вот этот пассаж понравился
ну это вроде очевидно... мапв же создаст честный вектор в качестве промежуточного результата
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
вот ещё интересный бенчмарк
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (filter even?)
     (map inc)
     (into [])))
Evaluation count : 423972 in 6 samples of 70662 calls.
            Execution time mean : 1,431504 µs
   Execution time std-deviation : 35,880031 ns
  Execution time lower quantile : 1,387881 µs ( 2,5%)
  Execution time upper quantile : 1,473489 µs (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (keep #(when (even? %) (inc %)))
     (into [])))
Evaluation count : 597684 in 6 samples of 99614 calls.
            Execution time mean : 1,025977 µs
   Execution time std-deviation : 48,029299 ns
  Execution time lower quantile : 967,445600 ns ( 2,5%)
  Execution time upper quantile : 1,098819 µs (97,5%)
                  Overhead used : 1,968342 ns

Found 1 outliers in 6 samples (16,6667 %)
 low-severe   1 (16,6667 %)
Variance from outliers : 13,8889 % Variance is moderately inflated by outliers
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (into [] (comp (filter even?) (map inc)))))
Evaluation count : 1158630 in 6 samples of 193105 calls.
            Execution time mean : 542,612330 ns
   Execution time std-deviation : 18,600472 ns
  Execution time lower quantile : 522,608964 ns ( 2,5%)
  Execution time upper quantile : 561,739359 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (into [] (keep #(when (even? %) (inc %))))))
Evaluation count : 1292682 in 6 samples of 215447 calls.
            Execution time mean : 476,297389 ns
   Execution time std-deviation : 27,399668 ns
  Execution time lower quantile : 446,612981 ns ( 2,5%)
  Execution time upper quantile : 509,450245 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
источник

E

ETL in Clojure — русскоговорящее сообщество
Andrey Ivanov
В Хаскеле лень и фьюзинг списков, поэтому там этого скорее всего и нет. Но могу ошибаться, нужно у настоящих хаскелистов спросить
В Haskell вариаций это сделать тьма. Мап лямбдой, list comprehension, свертки, filter.
источник

E

ETL in Clojure — русскоговорящее сообщество
Я пришёл в Clojure немного поразгрызя Haskell, моим крупнейшим заблуждением было то, что я думал - ха, одна парадигма, ща я все хаскелевскую идиоматику завезу. И тут же съел Сергею мозг расспросами про partial и comp, т.к. в Haskell на этом все стоит.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
вот ещё интересный бенчмарк
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (filter even?)
     (map inc)
     (into [])))
Evaluation count : 423972 in 6 samples of 70662 calls.
            Execution time mean : 1,431504 µs
   Execution time std-deviation : 35,880031 ns
  Execution time lower quantile : 1,387881 µs ( 2,5%)
  Execution time upper quantile : 1,473489 µs (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (keep #(when (even? %) (inc %)))
     (into [])))
Evaluation count : 597684 in 6 samples of 99614 calls.
            Execution time mean : 1,025977 µs
   Execution time std-deviation : 48,029299 ns
  Execution time lower quantile : 967,445600 ns ( 2,5%)
  Execution time upper quantile : 1,098819 µs (97,5%)
                  Overhead used : 1,968342 ns

Found 1 outliers in 6 samples (16,6667 %)
 low-severe   1 (16,6667 %)
Variance from outliers : 13,8889 % Variance is moderately inflated by outliers
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (into [] (comp (filter even?) (map inc)))))
Evaluation count : 1158630 in 6 samples of 193105 calls.
            Execution time mean : 542,612330 ns
   Execution time std-deviation : 18,600472 ns
  Execution time lower quantile : 522,608964 ns ( 2,5%)
  Execution time upper quantile : 561,739359 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (into [] (keep #(when (even? %) (inc %))))))
Evaluation count : 1292682 in 6 samples of 215447 calls.
            Execution time mean : 476,297389 ns
   Execution time std-deviation : 27,399668 ns
  Execution time lower quantile : 446,612981 ns ( 2,5%)
  Execution time upper quantile : 509,450245 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
ах да, забыл про list comprehensions
(criterium/quick-bench
   (into []
     (for [x [0 1 2 3 4 5 6 7 8 9]
           :when (even? x)]
       (inc x))))
Evaluation count : 681192 in 6 samples of 113532 calls.
            Execution time mean : 894,979809 ns
   Execution time std-deviation : 11,669267 ns
  Execution time lower quantile : 883,538835 ns ( 2,5%)
  Execution time upper quantile : 909,785069 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(criterium/quick-bench
   (->> [0 1 2 3 4 5 6 7 8 9]
     (keep #(when (even? %) (inc %)))
     (into [])))
Evaluation count : 671046 in 6 samples of 111841 calls.
            Execution time mean : 943,358807 ns
   Execution time std-deviation : 33,046507 ns
  Execution time lower quantile : 881,871219 ns ( 2,5%)
  Execution time upper quantile : 966,322918 ns (97,5%)
                  Overhead used : 1,968342 ns

Found 1 outliers in 6 samples (16,6667 %)
 low-severe   1 (16,6667 %)
Variance from outliers : 13,8889 % Variance is moderately inflated by outliers
=> nil
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Там можно использовать родные let, if. Вместо cond-let
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
ETL
В Haskell вариаций это сделать тьма. Мап лямбдой, list comprehension, свертки, filter.
Везде тьма. В той же Кложе  - фором, лупом, редьюсом и т.д.
ЗЫ UB40 и телек с потертым грифом дают +10 к первому впечатлению )
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Там можно использовать родные let, if. Вместо cond-let
Хм. Похоже, что да. Надо попробовать, или ты можешь написать пример - хотя бы переписать тот мой с cond-let выше. Навскидку не вижу как при этом совместить множественные точки выхода с последовательным определением новых локальных имен.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Andrey Ivanov
Хм. Похоже, что да. Надо попробовать, или ты можешь написать пример - хотя бы переписать тот мой с cond-let выше. Навскидку не вижу как при этом совместить множественные точки выхода с последовательным определением новых локальных имен.
(cond-let
[a (:a m)]
(not a) "not a"
[b (+ 1 a)]
[c (* 10 b)]
(< c 50) "too small c"
(= c 50) "exact c"
[d (str "a = " a ", b = " b ", c = " c)
 e (count d)]
:else {:text d, :length e})

(<<-
(let [a (:a m)])
(if (not a) "not a")
(let [b (+ 1 a)
      c (* 10 b)])
(if (< c 50) "too small c")
(if (= c 50) "exact c")
(let [d (str "a = " a ", b = " b ", c = " c)
      e (count d)])
{:text d, :length e})
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Спасибо, действительно линейная структура, единственно что - каждая внутренняя форма в дополнительных скобках.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
вот ещё любопытный бенчмарк про трансдьюсеры

(do
   "Get last elem - last of seq"
   (criterium/quick-bench
     (->> [0 1 2 3 4 5 6 7 8 9]
       (keep #(when (even? %) (inc %)))
       (last))))
Evaluation count : 1372284 in 6 samples of 228714 calls.
            Execution time mean : 452,627574 ns
   Execution time std-deviation : 19,990353 ns
  Execution time lower quantile : 435,447821 ns ( 2,5%)
  Execution time upper quantile : 479,943840 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(do
   "Get last elem - last of transduce into []"
   (criterium/quick-bench
     (->> [0 1 2 3 4 5 6 7 8 9]
       (into [] (keep #(when (even? %) (inc %))))
       (peek))))
Evaluation count : 1197108 in 6 samples of 199518 calls.
            Execution time mean : 583,447931 ns
   Execution time std-deviation : 58,146435 ns
  Execution time lower quantile : 526,700253 ns ( 2,5%)
  Execution time upper quantile : 647,100417 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
(do
   "Get last elem - transduce to last"
   (criterium/quick-bench
     (->> [0 1 2 3 4 5 6 7 8 9]
       (transduce
         (keep #(when (even? %) (inc %)))
         (fn
           ([])
           ([x] x)
           ([_ x] x))))))
Evaluation count : 2721834 in 6 samples of 453639 calls.
            Execution time mean : 225,106235 ns
   Execution time std-deviation : 9,321241 ns
  Execution time lower quantile : 216,239089 ns ( 2,5%)
  Execution time upper quantile : 238,738863 ns (97,5%)
                  Overhead used : 1,968342 ns
=> nil
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
что-то мало людей отметилось в опросе.
про dissoc-in никто не поставил галочку 🤔
источник