(defmacro vswap!
"Non-atomically swaps the value of the volatile as if:
(apply f current-value-of-vol args). Returns the value that
was swapped in."
{:added "1.7"}
[vol f & args]
(let [v (with-meta vol {:tag 'clojure.lang.Volatile})]
`(.reset ~v (~f (.deref ~v) ~@args))))