s-99-21


S-99-21 Insert an element at a given position into a list.

Example:

 (insert-at 'alfa '(a b c d) 2) 
 ; => (a alfa b c d) 

Solution:

 (define (insert-at x xs n) 
   (if (< n 0) 
       (reverse (insert-at x (reverse xs) (- n))) 
       (cond ((zero? n) xs) 
             ((= n 1) (cons x xs)) 
             ((null? xs) '()) 
             (else 
              (cons (car xs) (insert-at x (cdr xs) (- n 1))))))) 

Testing:

 >  (insert-at 'alfa '(a b c d) 2) 
 (a alfa b c d) 
 >  (insert-at 'alfa '(a b c d) -2) 
 (a b c alfa d) 
 >  (insert-at 'alfa '(a b c d) 0) 
 (a b c d) 
 >  (insert-at 'alfa '() 2) 
 () 
 >  (insert-at 'alfa '() 1) 
 (alfa) 
 > (insert-at 'alfa '(a b c d) 1000) 
 (a b c d)