Fork me on GitHub
#clojure-russia
<
2018-07-16
>
dottedmag06:07:39

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

igrishaev07:07:39

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

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

igrishaev07:07:37

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

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

igrishaev07:07:05

например

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

dottedmag11:07:59

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

dottedmag11:07:13

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

igrishaev11:07:22

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

igrishaev11:07:14

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