Saya telah menemukan bahwa paket-paket berbeda dalam instruksi instalasi mereka menggunakan push atau add-to-list (Misalnya menambahkan direktori ke load-path) dan saya bertanya-tanya apa perbedaannya dan seperti apa use case untuk masing-masingnya.
Saya telah menemukan bahwa paket-paket berbeda dalam instruksi instalasi mereka menggunakan push atau add-to-list (Misalnya menambahkan direktori ke load-path) dan saya bertanya-tanya apa perbedaannya dan seperti apa use case untuk masing-masingnya.
Jawaban:
Apa yang disebutkan #zck adalah satu perbedaan. Tetapi jika itu adalah satu-satunya perbedaan maka Anda bisa bertanya tentang cl-pushnew
dan add-to-list
.
Perbedaan penting lainnya: add-to-list
adalah fungsi, yang artinya mengevaluasi semua argumennya, khususnya yang pertama. push
adalah makro (sebagaimana adanya cl-pushnew
) - ia tidak mengevaluasi argumen keduanya; alih-alih, ia menafsirkannya sebagai tempat umum.
Misalnya, jika argumen kedua adalah simbol maka itu dianggap sebagai variabel, dan nilai argumen pertama dikonsolidasikan ke nilai simbol itu sebagai variabel, dan variabel diatur ke kontra baru itu.
Seperti yang dikatakan oleh string doc add-to-list
:
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)
masih memberi saya kesalahan - 5
bukan fungsi. Bagaimana ini berbeda dari add-to-list
perilaku?
(5 6)
ke tempat (nilai variabel) my-list
maka Anda perlu membuat daftar (5 6)
. Salah satu cara untuk melakukannya adalah menggunakan '(5 6)
; yang lain adalah menggunakan (list 5 6)
. push
mengevaluasi argumennya.
push
adalah tempat, seperti variabel. Arg pertama dievaluasi, dikontribusikan ke nilai variabel itu, dan variabel diatur ke kontra baru itu. add-to-list
mengevaluasi arg pertamanya untuk menghasilkan variabel yang nilainya diperbarui. push
tidak mengevaluasi arg kedua, yang merupakan variabel untuk memperbarui. Urutan arg dibalik antara keduanya.
Dari dokumentasi Emacs , atau C-h f push
:
Makro: push listname elemen
Makro ini membuat daftar baru yang mobilnya elemen dan yang CDR-nya adalah daftar yang ditentukan oleh listname, dan menyimpan daftar itu di listname.
Dari halaman yang sama, atau C-h f add-to-list
:
Fungsi: elemen simbol tambahkan-ke-daftar & tambahkan opsional-fn
Fungsi ini menetapkan simbol variabel dengan memasukkan elemen ke nilai lama, jika elemen belum menjadi anggota dari nilai itu.
Jadi add-to-list
hanya mendorong jika elemen belum ada di sana.
cl-pushnew
berperilaku seperti add-to-list
.
Perbedaan lain:
push
menambahkan elemen ke awal daftar .
add-to-list
memungkinkan Anda untuk menambahkan elemen ke awal atau akhir daftar .
(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")
add-to-list
kodecl-pushnew
, dan saya menemukan posting blog ini cukup mencerahkan: yoo2080.wordpress.com/2013/09/11/…