[已解决] 怎么改进delete-nth?

pop宏内部用的setq来搞,其实不是严格的destructive吧

(let* ((a '(1 2 3)) (b (cdr a))) (pop a) (eq b a)) ;; t

并不能

爲什麼0不能?

(defmacro nd (n exp)
  (let ((b (gensym)))
    `(let ((,b ,exp))
       (setf (nthcdr ,n ,b) (nthcdr ,(1+ n) ,b))
       ,b)))
(setq foo '(1 2 3 4))
;; -> (1 2 3 4)

(nd 0 foo)
;; ->  (2 3 4)

foo
;; -> (1 2 3 4)

因为

不可能破壞性去除一個列表的头。因為头沒了整个表也沒了。