Odpowiedzi:
To, o czym wspomina #zck, to jedna różnica. Ale gdyby to była jedyna różnica, możesz zapytać o cl-pushnew
i add-to-list
.
Kolejna ważna różnica: add-to-list
jest funkcją, która oznacza, że ocenia wszystkie argumenty, w szczególności pierwszy. push
jest makrem (jak jest cl-pushnew
) - nie ocenia drugiego argumentu; zamiast tego interpretuje to jako uogólnione miejsce.
Na przykład, jeśli drugi argument jest symbolem, wówczas jest on traktowany jako zmienna, a wartość pierwszego argumentu jest traktowana jako wartość tego symbolu jako zmienna, a zmienna jest ustawiana na te nowe minusy.
Jak add-to-list
mówi ciąg dokumentów :
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)
wciąż daje mi błąd - 5
nie jest funkcją. Czym różni się to od add-to-list
zachowania?
(5 6)
na miejsce (wartość zmiennej) my-list
, musisz utworzyć listę (5 6)
. Jednym ze sposobów na to jest użycie '(5 6)
; innym jest użycie (list 5 6)
. push
ocenia argument.
push
jest miejsce, takie jak zmienna. Pierwszy argument jest obliczany, przetwarzany na wartość tej zmiennej, a zmienna jest ustawiana na te nowe minusy. add-to-list
ocenia swój pierwszy argument, aby wygenerować zmienną, której wartość jest aktualizowana. push
nie ocenia drugiego argumentu, który jest zmienną do aktualizacji. Kolejność arg jest odwrócona między nimi.
Z dokumentacji Emacsa lub C-h f push
:
Makro: nazwa listy elementów push
To makro tworzy nową listę, której samochód jest elementem, a której cdr jest listą określoną przez listname, i zapisuje tę listę w liście name.
Z tej samej strony lub C-h f add-to-list
:
Funkcja: element symbolu dodaj do listy i opcjonalnie dodaj porównaj fn
Ta funkcja ustawia symbol zmiennej poprzez przypisanie elementu do starej wartości, jeśli element nie jest już członkiem tej wartości.
add-to-list
Pcha więc tylko wtedy, gdy elementu już nie ma.
cl-pushnew
zachowuje się jak add-to-list
.
Kolejna różnica:
push
dodaje element na początku listy .
add-to-list
pozwala dodać element na początku lub na końcu listy .
(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
na kod za pomocącl-pushnew
i uważam, że ten post na blogu jest dość pouczający: yoo2080.wordpress.com/2013/09/11/…