Câu trả lời:
Những gì #zck đề cập là một sự khác biệt. Nhưng nếu đó là sự khác biệt duy nhất thì bạn có thể hỏi về cl-pushnewvà add-to-list.
Một sự khác biệt quan trọng khác: add-to-listlà một hàm, có nghĩa là nó đánh giá tất cả các đối số của nó, đặc biệt là đối số đầu tiên. pushlà một macro (như hiện tại cl-pushnew) - nó không đánh giá đối số thứ hai của nó; thay vào đó, nó diễn giải nó như một nơi tổng quát.
Ví dụ: nếu đối số thứ hai là một ký hiệu thì nó được coi là một biến và giá trị của đối số thứ nhất được đặt vào giá trị của ký hiệu đó dưới dạng một biến và biến được đặt thành khuyết điểm mới đó.
Như chuỗi doc add-to-listnói:
This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)vẫn cho tôi một lỗi - 5không phải là một chức năng. Điều này khác với add-to-listhành vi của họ như thế nào?
(5 6)đến vị trí (giá trị của biến) my-listthì bạn cần tạo danh sách (5 6). Một cách để làm điều đó là sử dụng '(5 6); khác là sử dụng (list 5 6). pushđánh giá lập luận.
pushlà một nơi, chẳng hạn như một biến. Đối số đầu tiên được ước tính, dựa vào giá trị của biến đó và biến được đặt thành khuyết điểm mới đó. add-to-listđánh giá arg đầu tiên của nó để tạo ra biến có giá trị được cập nhật. pushkhông đánh giá arg thứ hai của nó, đó là biến cần cập nhật. Thứ tự arg được đảo ngược giữa hai.
Một điểm khác biệt:
pushthêm phần tử vào đầu danh sách .
add-to-listcho phép bạn thêm phần tử vào đầu hoặc cuối danh sách .
(setq testasdf nil)
(push 'a testasdf)
testasdf
(a)
(add-to-list 'testasdf 'b)
testasdf
(b a)
;; add element to the end
(add-to-list 'testasdf "hello" t)
testasdf
(b a "hello")
Từ tài liệu Emacs , hoặc C-h f push:
Macro: danh sách phần tử đẩy
Macro này tạo một danh sách mới có xe là thành phần và cdr của nó là danh sách được chỉ định bởi listname và lưu danh sách đó trong listname.
Từ cùng một trang, hoặc C-h f add-to-list:
Chức năng: phần tử ký hiệu thêm vào danh sách & phần bổ sung tùy chọn so sánh-fn
Hàm này đặt ký hiệu biến bằng cách đặt phần tử vào giá trị cũ, nếu phần tử chưa phải là thành viên của giá trị đó.
Vì vậy, add-to-listchỉ đẩy nếu phần tử chưa có.
cl-pushnewcư xử như add-to-list.
add-to-listmã bằng cách sử dụngcl-pushnewvà tôi thấy bài đăng trên blog này khá thú vị: yoo2080.wordpress.com/2013/09/11/ Kẻ