В результате мне посоветовали интегрант, маунт и компонент 😄
@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, только еще с доп. параметрами для байндинга переменных и др