Sự khác biệt giữa đẩy và thêm vào danh sách là gì?


26

Tôi đã thấy rằng các gói khác nhau trong hướng dẫn cài đặt của chúng sử dụng hoặc đẩy hoặc thêm vào danh sách (Ví dụ: thêm một thư mục vào đường dẫn tải) và tôi đã tự hỏi sự khác biệt là gì và trường hợp sử dụng cho mỗi trường hợp sẽ là gì.


1
Tôi đã vật lộn để chuyển đổi mã bằng cách sử dụng add-to-listmã bằng cách sử dụng cl-pushnewvà tôi thấy bài đăng trên blog này khá thú vị: yoo2080.wordpress.com/2013/09/11/ Kẻ
dangom

Câu trả lời:


21

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-pushnewadd-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'.

6
Cũng theo trình biên dịch byte:add-to-list can't use lexical var ...; use push or cl-pushnew
Malabarba

(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?
markasoftware

@markasoftware: Bạn đang cố gắng làm gì? Nếu bạn muốn đẩy danh sách (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.
vẽ

@ Bạn đã nói bây giờ rằng nó đánh giá đối số, nhưng câu trả lời của bạn có nghĩa đen là "nó không đánh giá đối số đầu tiên", đó là nguồn gốc của sự nhầm lẫn của tôi.
markasoftware

@markasoftware: Tôi xin lỗi; Tôi đã có một lỗi đánh máy - Tôi đã viết "đối số thứ nhất" trong đó tôi nên viết "đối số thứ hai". Sửa chữa ngay bây giờ - cảm ơn. Đối số thứ hai 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.
vẽ

15

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")

14

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.
sam boosalis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.