The second condition kind of threw me, but here is one way. Maybe I can come up with a more elegant way once my mind starts working better.
(defun Let ( varList funToDo / oValList nValList Results )
(foreach i varList
(setq oValList (cons (eval (car i)) oValList))
(setq nValList (cons (eval (cadr i)) nValList))
)
(setq cnt (1- (length nValList)))
(foreach i varList
(set (car i) (nth cnt nValList))
(setq cnt (1- cnt))
)
(setq Results (eval funToDo))
(mapcar
'(lambda (a b)
(set (car a) b)
)
varList
(reverse oValList)
)
Results
)