(let* ((a 1) (b a))
(+ a b))
is an abbreviation for (let ((a 1))
(let ((b a))
(+ a b))))
which, in turn, is a syntactic sugar for ((lambda (a)
((lambda (b)
(+ a b)) a)) 1)
There is no "assignment", only lexicaly scooped bindings, which are "stateless" and "declarative".Looping constructs in Racket are just syntactic sugar - layered macros, based on what they call "contracts", I suppose.
In CL looping constructs are micro-DSLs.