(defmacro returning"Compute a return value, then execute other forms for side effects.
Like prog1 in common lisp, or a (do) that returns the first form."[value&forms]`(let [value#~value]~@formsvalue#))

Of course, when you’re in a hurry, there’s no time for adding new dependencies.
There’s not even time to write your own inline version of the macro. Besides,
they say that you shouldn’t ever write your own macros. So what do you do? You
compose doto and do:

(doto x(do(y)(z)));; returns x

But maybe instead of x you have (a complicated form) and you want to give
its result a name. Luckily there’s as->.

(doto (acomplicatedform)(as->x(do(yx)(zx))))

When you’re debugging a long -> thread, a print function that returns the
printed value would be handy so you could insert it in the middle of the chain.
This is of course exactly what tools.trace is for. But again, who has
time for adding dependencies? Just use doto.