(define-macro (let+ bindings . body)
(if (null? bindings) `(begin ,@body)
(cond ((atom? (caar bindings))
`(let (,(car bindings))
(let+ ,(cdr bindings) ,@body)))
((list? (caar bindings))
`(apply (lambda* ,(caar bindings)
(let+ ,(cdr bindings) ,@body))
,(cadar bindings)))
(else
`(let ((,(caaar bindings) (car ,(cadar bindings)))
(,(cdaar bindings) (cdr ,(cadar bindings))))
(let+ ,(cdr bindings) ,@body))))))
Rate working version.
Lessons learned, define-macro is the way.