Welcome! Please see the About page for a little more info on how this works.
Why clojure.core/vswap is a macro with tag hint instead of a function called on clojure.lang.Volatile similar to clojure.core/swap?
I don't know for sure, but this comment on the initial ticket seems plausible.
https://clojure.atlassian.net/browse/CLJ-1512?focusedCommentId=19049
the vswap! macro is probably for performance reasons (the main motivation of this code to begin with), to avoid using apply or unrolling tons of arities