The following implementation of with-gensyms, intended to operate on a let-like argument list, generates an extra comma within the nested let:
(defmacro with-gensyms (vars &rest forms)
`(let ,(loop for var in vars
collect (if (listp var)
`(,(car var) (gensym))
`(,var (gensym))))
`(let ,,(loop for genvar in vars
collect (if (listp genvar)
`(,(car genvar) ,(car (cdr genvar)))
`(,genvar nil)))
,,@forms)))
An example macroexpansion:
(with-gensyms ((var1 1) (var2 2) (testvar "testname") the-number-zero))
(LET ((VAR1 (GENSYM))
(VAR2 (GENSYM))
(TESTVAR (GENSYM))
(THE-NUMBER-ZERO (GENSYM)))
`(LET ,((VAR1 1) (VAR2 2) (TESTVAR "testname") (THE-NUMBER-ZERO NIL))))
There's an extra comma before the argument list for the nested let, and it's not obvious to me why this is the case.
The target output is the following:
(let ((var1 (gensym)) (var2 (gensym)) (testvar (gensym)) (the-number-zero (gensym)))
`(let ((,var1 1) (,var2 2) (,testvar "testname") (,the-number-zero nil))))
Any help would be nice!