Size: a a a

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

2019 May 13

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
в итоге пришлось воткнуть в нашу внутреннюю библиотеку костыль:
(defmacro try-catchall
 "See prismatic schema.macros/try-catchall."
 [& body]
 (let [[try-body
        [catch bind & catch-body]
        [finally & fin]] (if (= 'catch (first (last body)))
                           (cons (butlast body)
                                 (take-last 1 body))
                           (cons (butlast (butlast body))
                                 (take-last 2 body)))]
   (assert (= catch 'catch))
   (assert (symbol? bind))
   (assert (contains? #{'finally nil} finally))
   ;; finally in core.async can break your code: https://dev.clojure.org/jira/browse/ASYNC-198
   (if-not finally
     `(if-cljs
        (try ~@try-body (catch js/Error  ~bind ~@catch-body))
        (try ~@try-body (catch Throwable ~bind ~@catch-body)))
     `(if-cljs
        (try ~@try-body (catch js/Error  ~bind ~@catch-body) (finally ~@fin))
        (try ~@try-body (catch Throwable ~bind ~@catch-body) (finally ~@fin))))))
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
раньше там не было (if-not finally ...), был просто (try ... (finally <тут было пусто если не было finally>))
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
и без core.async это всё работало хорошо
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
это вообще не core.async-специфичные макросы
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
а при использовании внутри core.async оно начало возвращать рандомные результаты
источник

AS

Art Semyonov (vi/vim) in Clojure — русскоговорящее сообщество
Алесь Гузик
а при чём тут best practice? во-первых код в gist это не про то что у меня было, у меня было вот https://dev.clojure.org/jira/browse/ASYNC-198?focusedCommentId=51235&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-51235 . во-вторых код такого типа генерировался макросом, а не руками.
Касательно best practice – мелкие single purpose функции. Касательно гиста – я не про тебя, а про ASYNC-198 в целом. Твой случай тоже будет работать.
источник

AS

Art Semyonov (vi/vim) in Clojure — русскоговорящее сообщество
Это, несомненно, проблемы не отменяет.
источник

AS

Art Semyonov (vi/vim) in Clojure — русскоговорящее сообщество
Но я делал try-catch-finally и никогда не натыкался, потому что такое всегда находится в мелкой функции где-то снаружи.
источник

AS

Art Semyonov (vi/vim) in Clojure — русскоговорящее сообщество
Энивей, использование core.async стоит оттягивать до последнего.
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
core.async и мелкие single purpose функции к сожалению плохо совместимы. он сам как раз приводит к тому что код получается длинной императивной портянкой.
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
судя по вот этому я не единственный кто на то же самое натыкался
источник

AS

Art Semyonov (vi/vim) in Clojure — русскоговорящее сообщество
Алесь Гузик
core.async и мелкие single purpose функции к сожалению плохо совместимы. он сам как раз приводит к тому что код получается длинной императивной портянкой.
Есть такое, да. Он возводит когнитивную нагрузку на максимальную высоту. И это довольно больно после спокойной разработки без него.
источник

AS

Art Semyonov (vi/vim) in Clojure — русскоговорящее сообщество
Если стоит выбор провести свободное время каким нибудь полезным способом или взять clojure.async, стоит выбирать первое.
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
Приветствую! Что вы сейчас используете для тестов? У меня пока clojure.test + Makefile. Есть ли профит перехода с clojure.test на Midje (https://github.com/marick/Midje). Я что-то кроме немного другого синтаксиса ничего важного не заметил.
И еще, кто-то юзает Kaocha (https://github.com/lambdaisland/kaocha) для запуска тасков, как она?
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
clojure.test и eftest для запуска
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
о eftest не слышал. пойду посмотрю…
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
midje я раньше пробовал и сегодня ещё раз пробовал в новом проекте, но в итоге вернул clojure.test и заменил midje на на are из него
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
  (t/are [expr result] (= result (e/eval-base expr))
   '[:call
     [:lambda [x y]
      [:call [:lookup +] [:lookup x] [:lookup x] [:lookup y]]]
     [:literal 1] [:literal 2]]
   #_=> 4

   '[:literal 5] #_=> 5))
источник

АГ

Алесь Гузик in Clojure — русскоговорящее сообщество
Art Semyonov (vi/vim)
Касательно best practice – мелкие single purpose функции. Касательно гиста – я не про тебя, а про ASYNC-198 в целом. Твой случай тоже будет работать.
ну и кстати, у тебя может быть вполне тривиальная функция вида
(defn foo [x]
 (try (library/do-something x)
   (catch SomeException e nil)))
Если при этом library/do-something это макрос, который развернётся во что-то с try-catch-finally, то всё равно жопа
источник