Dans une boucle, il est souvent nécessaire d'utiliser des variables locales qui ne sont pas des variables de boucle, un peu comme si la boucle était entourée d'un let ou d'un let*. Afin d'économiser ce let, loop permet l'utilisation de clauses with dont l'effet est de rajouter la création et l'initialisation d'une variable locale dans le prologue de la boucle. Plusieurs clauses with fonctionnent comme un let*. Si un comportement similaire à let est souhaité, on peut employer le mot-clé and. Exemples :
* (loop with val = 5
with sin = (sin val)
for i from 0 to 2
sum (+ i val sin))
15.123227
* (let ((val 4))
(loop with val = 5
and sin = (sin val)
for i from 0 to 2
sum (+ i val sin)))
15.729592
*