+ t))
+
+(defun inner-body (loop)
+ (if (multiple-fors? loop)
+ (append (body loop)
+ (loop :for (var nil step test) :in (iterations loop)
+ :collect `(setf ,var ,step)
+ :when test :collect `(when ,test (break))))
+ (body loop)))
+
+(defun the-actual-loop (loop)
+ (let ((body `(,@(awhen (during-first loop)
+ `((when ,(first-guard loop)
+ ,@it
+ (setf ,(first-guard loop) nil))))
+ ,@(inner-body loop)
+ ,@(when (during-last loop)
+ `((setf ,(last-guard loop) t))))))
+ (if (multiple-fors? loop)
+ `(while t ,@body)
+ `(for ,(inits loop) (,(end-test loop)) ,(steps loop) ,@body))))
+
+(defun the-loop-form (loop)
+ (let ((form `(progn
+ ,@(initially loop)
+ ,(the-actual-loop loop)
+ ,@(awhen (during-last loop)
+ `((when ,(last-guard loop) ,@it)))
+ ,@(finally loop))))
+ (when (multiple-fors? loop)
+ (loop :for (var init nil test) :in (reverse (iterations loop))
+ :when test :do (setf form `(unless ,test ,form))
+ :do (setf form `(let ((,var ,init)) ,form))))
+ form))