Emacs Lisp Manual 中提到的「破坏性」(Destructively / Destructive)指会修改 List 结构的操作,push
并没有没有破坏性,因为它不会修改任何既有 List 的结构:
(push path load-path)
;; 展开
(setq load-path (cons path load-path))
append
也没有破坏性,因为它虽然必须修改列表的结构,但它事先做了必要的拷贝:
(append list1 list2)
;; 有一些类似于
(nconc (copy-sequence list1) list2)
此外,破坏性不等于 In-place 地修改参数,常常还是要依赖于返回值,所以得用 (setq foo (... foo ...))
。