clojure-russia 2018-07-16

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

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

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

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

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

например

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

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

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

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

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