; two versions, first is more efficient methinks (define (list-insert! lst idx val) (if (equal? (length lst) idx) (set-cdr! (list-tail lst (- idx 1)) (list val)) (let ((sublst (list-tail lst idx))) (set-cdr! sublst (cons (car sublst) (cdr sublst))) (set-car! sublst val))) lst) (define (list-with-insertion lst idx val) (if (zero? idx) (cons val (list-with-insertion lst (- idx 1) val)) (if (null? lst) lst (cons (car lst) (list-with-insertion (cdr lst) (- idx 1) val)))))