Loop Unrolling
Substitution makes it easy to do loop unrolling:
(defun unroll (var n code)
(let (res)
(dotimes (i n)
(push (subst (1+ i) var code) res))
(cons 'progn (reverse res)) ))
>(unroll 'j 5 '(|:=| (aref x (+ -8 (* 8 j))) 0))
(PROGN
(|:=| (AREF X (+ -8 (* 8 1))) 0)
(|:=| (AREF X (+ -8 (* 8 2))) 0)
(|:=| (AREF X (+ -8 (* 8 3))) 0)
(|:=| (AREF X (+ -8 (* 8 4))) 0)
(|:=| (AREF X (+ -8 (* 8 5))) 0))