Відповіді:
Що згадує #zck - це одна різниця. Але якби це була єдина відмінність, тоді ви могли б запитати про cl-pushnew
і add-to-list
.
Ще одна важлива відмінність: add-to-list
це функція, яка означає, що вона оцінює всі свої аргументи, зокрема перший. push
є макросом (як є cl-pushnew
) - він не оцінює свій другий аргумент; натомість вона трактує це як узагальнене місце.
Наприклад, якщо другий аргумент є символом, то він розглядається як змінна, а значення першого аргументу передається на значення цього символу як змінної, а змінна встановлюється на ці нові мінуси.
Як add-to-list
говорить рядок doc :
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)
все ще дає мені помилку - 5
це не функція. Чим це відрізняється від add-to-list
поведінки Росії?
(5 6)
на місце (значення змінної), my-list
вам потрібно створити список (5 6)
. Один із способів зробити це - використовувати '(5 6)
; інший - використовувати (list 5 6)
. push
оцінює аргумент.
push
- це місце, наприклад змінна. Перший аргумент оцінюється, передається на значення цієї змінної, і змінна встановлюється до нових мінусів. add-to-list
оцінює свій перший аргумент для створення змінної, значення якої оновлюється. push
не оцінює свій другий аргумент, який є змінною для оновлення. Порядок аргументів повернений між двома.
З документації Emacs або C-h f push
:
Макрос: ім'я списку натискання елементів
Цей макрос створює новий список, автомобіль якого є елементом і cdr - список, визначений listname, і зберігає цей список у listname.
З тієї ж сторінки, або C-h f add-to-list
:
Функція: елемент символу додавання до списку та додаткове додавання порівняння-fn
Ця функція встановлює символ змінної шляхом перенесення елемента на старе значення, якщо елемент ще не є членом цього значення.
Тож add-to-list
натискає лише, якщо елемента вже немає.
cl-pushnew
поводиться як add-to-list
.
Ще одна відмінність:
push
додає елемент на початок списку .
add-to-list
дозволяє додати елемент до початку чи кінця списку .
(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
кодуcl-pushnew
, і я вважав, що ця публікація в блозі є досить захоплюючою: yoo2080.wordpress.com/2013/09/11/…