Write a Common Lisp macro to handle this code pattern:
(let-gensyms (decoder validator value-handler key-handler pass) (let ((vars-tmp (loop repeat (length vars) collect (gensym)))) `(let (,@vars-tmp (,pass (constantly t))) (let ((,validator (custom-decoder :beginning-of-object ,pass :object-key ,pass :object-value ,pass :end-of-object ,pass :beginning-of-array ,pass :array-member ,pass :end-of-array ,pass :beginning-of-string ,pass :string-char ,pass :end-of-string ,pass :internal-decoder 'decode-json)) (,decoder (current-decoder)) (,key-handler *object-key-handler*) (,value-handler *object-value-handler*)) (declare (ignorable ,decoder ,key-handler ,value-handler)) ,(if (null vars) `(decode-json-from-source ,json-source ,validator) `(bind-custom-vars (,@(json-bind-level-customizations (loop for var in vars for var-tmp in vars-tmp collect (cons var-tmp (symbol-name var))) nil decoder validator key-handler value-handler pass) :aggregate-scope (union *aggregate-scope-variables* '(*object-key-handler* *object-value-handler* *internal-decoder*))) (decode-json-from-source ,json-source)))) (let ,(mapcar #'list vars vars-tmp) ,@body))))

Problem: Macro call that should be transformed by let-gensyms

Macro definition:
(defmacro let-gensyms ((&rest names) &body body)
  `(let ,(loop for name in names collect `(,name (gensym)))
     ,@body))

Macroexpansion:
(let ((decoder (gensym)) (validator (gensym)) (value-handler (gensym)) (key-handler (gensym)) (pass (gensym))) (let ((vars-tmp (loop repeat (length vars) collect (gensym)))) (sb-int:quasiquote (let (#S(sb-impl::comma :expr vars-tmp :kind 2) (#S(sb-impl::comma :expr pass :kind 0) (constantly t))) (let ((#S(sb-impl::comma :expr validator :kind 0) (custom-decoder :beginning-of-object #S(sb-impl::comma :expr pass :kind 0) :object-key #S(sb-impl::comma :expr pass :kind 0) :object-value #S(sb-impl::comma :expr pass :kind 0) :end-of-object #S(sb-impl::comma :expr pass :kind 0) :beginning-of-array #S(sb-impl::comma :expr pass :kind 0) :array-member #S(sb-impl::comma :expr pass :kind 0) :end-of-array #S(sb-impl::comma :expr pass :kind 0) :beginning-of-string #S(sb-impl::comma :expr pass :kind 0) :string-char #S(sb-impl::comma :expr pass :kind 0) :end-of-string #S(sb-impl::comma :expr pass :kind 0) :internal-decoder (quote decode-json))) (#S(sb-impl::comma :expr decoder :kind 0) (current-decoder)) (#S(sb-impl::comma :expr key-handler :kind 0) *object-key-handler*) (#S(sb-impl::comma :expr value-handler :kind 0) *object-value-handler*)) (declare (ignorable #S(sb-impl::comma :expr decoder :kind 0) #S(sb-impl::comma :expr key-handler :kind 0) #S(sb-impl::comma :expr value-handler :kind 0))) #S(sb-impl::comma :expr (if (null vars) (sb-int:quasiquote (decode-json-from-source #S(sb-impl::comma :expr json-source :kind 0) #S(sb-impl::comma :expr validator :kind 0))) (sb-int:quasiquote (bind-custom-vars (#S(sb-impl::comma :expr (json-bind-level-customizations (loop for var in vars for var-tmp in vars-tmp collect (cons var-tmp (symbol-name var))) nil decoder validator key-handler value-handler pass) :kind 2) :aggregate-scope (union *aggregate-scope-variables* (quote (*object-key-handler* *object-value-handler* *internal-decoder*)))) (decode-json-from-source #S(sb-impl::comma :expr json-source :kind 0))))) :kind 0)) (let #S(sb-impl::comma :expr (mapcar (function list) vars vars-tmp) :kind 0) #S(sb-impl::comma :expr body :kind 2))))))