clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
dottedmag 2018-07-16T06:41:39.000133Z

В результате мне посоветовали интегрант, маунт и компонент 😄

igrishaev 2018-07-16T07:22:39.000249Z

@dottedmag для таких вещей подойдут макросы типа with-something. Каждый такой макрос оборачивает тело в try и в секции finally делает откат. В итоге получается

(with-step1 a b c
  (with-step2 foo bar
    (with-step3 duno lol
      (do-my-sfuff arg1 arg2))))

igrishaev 2018-07-16T07:24:37.000011Z

если макрос должен передать открытый им порт, то можно забиндить его внутренним let например

(with-opened-port my-port connection-params
   ;; now my-port is bound to the open port)

igrishaev 2018-07-16T07:27:05.000123Z

например

(defmacro with-driver
  [type opt bind & body]
  `(client/with-pool {}
     (let [~bind (boot-driver ~type ~opt)]
       (try
         ~@body
         (finally
           (quit ~bind))))))

dottedmag 2018-07-16T11:03:59.000249Z

@igrishaev См выше: я хочу в месте, где do-my-stuff вернуться из функции, а потом позвать закрывающую отдельно.

dottedmag 2018-07-16T11:04:13.000227Z

Потому что with-a/b/c — это внутренние детали компонента.

igrishaev 2018-07-16T11:06:22.000132Z

Можно в параметрах макроса прокинуть тело для отката.

igrishaev 2018-07-16T11:07:14.000343Z

типа, тело когда все хорошо, тело когда была ошибка. как if, только еще с доп. параметрами для байндинга переменных и др