habeのコメント: マクロにする必要って、ありますかね (スコア 1) 3
「Case 3: '(1)→'()だけどうにかならないか」を諦めちゃうのであれば、普通に関数で書いた方がすっきりすると思います。
あと、せっかくなのでimproper-listに対応しました。こんな感じです:
Case 4: (nakanuki! 2 '(1 2 3 . 4)) => '(1 2 . 4)
Case 5: (nakanuki! 0 '(1 . 2)) => 2
Case 6: (nakanuki! 1 '#1=(1 2 3 . #1#)) => '#1=(1 3 . #1#) ;; うーん。これは今ひとつかも。
(defun nakanuki! (idx lst)
"lisからidx番目を破壊的に取り除く"
(unless (= 0 idx)
(error "idxの値(%d)がヘンですー" idx))
(cond
((atom (cdr lst))
;; ↓互換性のために入れたけど、この1行は嫌だなぁ…
(setf (car lst) (cdr lst))
(cdr lst))
((= idx 0)
(setf (car lst) (cadr lst))
(nakanuki! 1 lst))
(t
(setf (cdr (nthcdr (1- idx) lst))
(nthcdr (1+ idx) lst))
lst)))