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-pushnew
và add-to-list
.
Một sự khác biệt quan trọng khác: add-to-list
là 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. push
là 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-list
nó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 - 5
không phải là một chức năng. Điều này khác với add-to-list
hành vi của họ như thế nào?
(5 6)
đến vị trí (giá trị của biến) my-list
thì 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.
push
là 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. push
khô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:
push
thêm phần tử vào đầu danh sách .
add-to-list
cho 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-list
chỉ đẩy nếu phần tử chưa có.
cl-pushnew
cư xử như add-to-list
.
add-to-list
mã bằng cách sử dụngcl-pushnew
và tôi thấy bài đăng trên blog này khá thú vị: yoo2080.wordpress.com/2013/09/11/ Kẻ