(defn log-source*
[reader f]
(let [frame (.source-log-frames ^SourceLoggingPushbackReader reader)
^StringBuilder buffer (:buffer @frame)
new-frame (assoc-in @frame [:offset] (.length buffer))]
(with-bindings {frame new-frame}
(let [ret (f)]
(if (instance? clojure.lang.IMeta ret)
(merge-meta ret {:source (peek-source-log frame)})
ret)))))