#-(and) "

P20 (*) Remove the K'th element from a list.
    Example:
    * (remove-at '(a b c d) 2)
    (A C D)
"


;; Recursive solution, sharing the tail:

(defun remove-at (list index)
  (cond
    ((< index 1) (error "Invalid index"))
    ((= index 1) (rest list))
    (t           (cons (first list) (remove-at (rest list) (1- index))))))


;; Iterative solution, sharing the tail:

(defun remove-at (list index)
  (cond
    ((< index 1) (error "Invalid index"))
    (t           (loop
                    :for rest :on list
                    :repeat (1- index)
                    :collect (first rest) :into left
                    :finally (return (nconc left (rest rest)))))))

;; Iterative solution, copying the whole result:

(defun remove-at (list index)
  (cond
    ((< index 1) (error "Invalid index"))
    (t           (loop
                    :for item :in list
                    :for i :from 1
                    :unless (= i index) :collect item))))


;; Functional solution, sharing the tail:

(defun remove-at (list index)
  (append (subseq list 0 (1- index)) (nthcdr index list)))


;; Functional solution, copying the whole result:

(defun remove-at (list index)
  (append (subseq list 0 (1- index)) (copy-list (nthcdr index list))))

;; For both these functional solutions, we could replace append by
;; nconc, since subseq returns a new list, so we could just modify the
;; last cdr to attach it to the rest.



;; Smartass solution, using Common Lisp:

(defun remove-at (list index)
  (remove-if (constantly t) list :start (1- index) :end index))


;;;; THE END ;;;;
ViewGit