Also maybe accept keywords:
For example:
(let loop (#:? [iter 1] #:? [acc '()] #:? [left '()] #:? [right l])
(cond
[(empty? right)
(reverse acc)]
[(eq? x 'restart)
(loop #:iter (+ iter 1)
#:acc acc
#:left '()
#:right (append (reverse left) (rest right)))]
[else
(define x (first right))
(loop #:iter (+ iter 1)
#:acc (cons (list iter x) acc)
#:left (cons x left)
#:right (rest right))]))
That's a lot more readable when there are many arguments.