(defmacro block
([] `nil)
([hd & tl]
(if (and (seq? hd) (#{'let 'let*} (first hd)))
`(let ~(second hd) (block ~@tl))
`(do ~hd (block ~@tl)))))
; (use 'clojure.walk) (println (macroexpand-all '
(block
(let [x 1])
(let [y 2])
(println (+ x y))
(let [z 3])
(println (+ x y z)))
; ))
KGRlZm1hY3JvIGJsb2NrCiAgKFtdIGBuaWwpCiAgKFtoZCAmIHRsXQogICAgKGlmIChhbmQgKHNlcT8gaGQpICgjeydsZXQgJ2xldCp9IChmaXJzdCBoZCkpKQogICAgICBgKGxldCB+KHNlY29uZCBoZCkgKGJsb2NrIH5AdGwpKQogICAgICBgKGRvIH5oZCAoYmxvY2sgfkB0bCkpKSkpCgo7ICh1c2UgJ2Nsb2p1cmUud2FsaykgKHByaW50bG4gKG1hY3JvZXhwYW5kLWFsbCAnCihibG9jawogIChsZXQgW3ggMV0pCiAgKGxldCBbeSAyXSkKICAocHJpbnRsbiAoKyB4IHkpKQogIChsZXQgW3ogM10pCiAgKHByaW50bG4gKCsgeCB5IHopKSkKOyApKQ==