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)
因为
不可能破壞性去除一個列表的头。因為头沒了整个表也沒了。