Size: a a a

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

2020 March 04

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
Mike Bohdan
кто подскажет есть ли какая-то тула чтоб резолвить ресурсы?
например у меня есть файл resources/project-name/module/config.edn
{:host localhost
:port 666}

я хочу чтоб в коде я например мог сделать (:require [project-name.module :refer [config]]) и это была просто мапка
кстати: (def config (load-file “resources/project-name/module/config.edn”))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
(defn find-by-priority-pred
 "Take sequence of predicated and find first item in xs for best matching predicate."
 [preds, xs]
 (let [pred (apply some-fn (map-indexed
                             (fn [i pred] #(when (pred %) [i %]))
                             preds))]
   (second
     (reduce (fn [old-res, v]
               (let [[^int i _ :as new-res] (pred v)]
                 (cond
                   (nil? new-res) old-res
                   (zero? i) (reduced new-res)
                   (nil? old-res) new-res
                   (< i ^int (first old-res)) new-res
                   :else old-res)))
       nil xs))))
=> #'dev.playground/find-by-priority-pred
 (find-by-priority-pred [#(= "physical" (:type %))
                         #(= "postal" (:type %))]
   [{:text "42" :type "eternal"}
    {:text "123" :type "postal"}
    {:text "789" :type "physical"}])
=> {:text "789", :type "physical"}
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey Ivanov
поздно, я уже оптимальный вариант для часто переезжающего кастомера накостылил
  (loop [physical nil
        postal nil
        [{:keys [type text]} :as r] (get-in value [:organization :resource :address])]
   (cond
     physical physical
     (empty? r) postal
     :else (recur ({"physical" text} type)
                  (or postal ({"postal" text} type))
                  (rest r))))
что-то тут не совсем оптимально, медленнее чем group-by получилось
но я причину не искал, так как мне было интересно получить функцию общего применения
источник

AI

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

AI

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

ST

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

AI

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

AI

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

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну, просто получилось и сложнее и медленнее в общем случае
слово «оптимальный» не очень подходит
источник

AI

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

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
моя функция получилась быстрее и универсальнее
проигрывает твоему циклу только на оптимистическом датасете, и то только из-за универсальности
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
моя функция получилась быстрее и универсальнее
проигрывает твоему циклу только на оптимистическом датасете, и то только из-за универсальности
плюс бонусом информация о сработавшем предикате
источник

AI

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

AI

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

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Кстати, про универсальность и оптимизации - с математической точки зрения правая свертка позволяет выразить любые операции над списками, в том числе и бесконечными (в условиях ленивой семантики ядра свертки). Но на практике в условиях строгой семантики и конечных списков зачастую можно не бежать до конца списка, возвратив аккумулятор когда он будет удовлетворять требуемому условию. Но поскольку практические реализации тянутся из теоретических пейперов и из Хаскелей, где это проблема решается автоматически, то и здесь тоже редьюс бежит честно до конца списка. Хотя добавить в редьюс предикат на аккумулятор для остановки - дело пары секунд.
источник
2020 March 05

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Mike Bohdan
ну “конфиг” там очень условно,  у меня может и не быть такого модуля в коде, а если куча разных по смыслу edn и лоадить их через def – выглядит не очень красиво
Я при помощи mount сделал, на гитхабе лежит, если интересно
GitHub.com/maxp/clj-mlib
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Там весь смысл в том, что как правило, некоторые параметры конфига надо определять в рантайме, скажем по енвайронменту.
источник

ИС

Ильшат Султанов in Clojure — русскоговорящее сообщество
Всем привет. Есть кто юзает sente? Как вы хэндлите ошибки подключения клиента?

(defn start-client-chsk-router!
 [ch-recv event-msg-handler &
  [{:as opts :keys [trace-evs? error-handler]}]]
 (-start-chsk-router! (not :server) ch-recv event-msg-handler opts))


В сорцах видно, что есть возможность указать error-handler, но он вообще никак не срабатывает. Через ивент :chsk/state получается некрасиво и работает только для режима :ws.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Ильшат Султанов
Всем привет. Есть кто юзает sente? Как вы хэндлите ошибки подключения клиента?

(defn start-client-chsk-router!
 [ch-recv event-msg-handler &
  [{:as opts :keys [trace-evs? error-handler]}]]
 (-start-chsk-router! (not :server) ch-recv event-msg-handler opts))


В сорцах видно, что есть возможность указать error-handler, но он вообще никак не срабатывает. Через ивент :chsk/state получается некрасиво и работает только для режима :ws.
«работает только для режима :ws.» это точно?
у меня на это завязано определение, что соединение установлено, я вроде проверял вариант с поллингом
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
error-handler не использовал
источник