Kurulum talimatlarındaki farklı paketlerin ya itme veya listeye ekleme kullandığını buldum (Örneğin, yükleme yoluna bir dizin ekleme) ve farkın ne olduğunu ve her birinin kullanım durumunun ne olacağını merak ediyordum.
Kurulum talimatlarındaki farklı paketlerin ya itme veya listeye ekleme kullandığını buldum (Örneğin, yükleme yoluna bir dizin ekleme) ve farkın ne olduğunu ve her birinin kullanım durumunun ne olacağını merak ediyordum.
Yanıtlar:
#Zck'in bahsettiği şey bir farktır. Ama tek fark bu olsaydı, o zaman cl-pushnew
ve hakkında sorabilirsiniz add-to-list
.
Bir diğer önemli fark: add-to-list
bir fonksiyondur, yani bütün argümanlarını, özellikle ilkini değerlendirir. push
bir makrodur (olduğu gibi cl-pushnew
) - ikinci argümanını değerlendirmez; bunun yerine, genelleştirilmiş bir yer olarak yorumlar.
Örneğin, ikinci argüman bir sembol ise, o zaman bir değişken olarak kabul edilir ve ilk argümanın değeri bu sembolün değeri üzerine bir değişken olarak kabul edilir ve değişken o yeni eksilere ayarlanır.
Doktor dize add-to-list
diyor ki:
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)
hala bana bir hata veriyor - 5
bir işlev değil. Bu add-to-list
davranışından nasıl farklı ?
(5 6)
(değişkenin değeri) my-list
o zaman listeyi oluşturmanız gerekir (5 6)
. Bunu yapmanın bir yolu kullanmaktır '(5 6)
; başka bir kullanmaktır (list 5 6)
. push
Argümanı değerlendirir.
push
değişken gibi bir yer. İlk argüman değerlendirilir, bu değişkenin değerine düşürülür ve değişken o yeni eksilere ayarlanır. add-to-list
değeri güncellendiğinde değişkeni üretmek için ilk argümanını değerlendirir. push
güncellenecek değişken olan ikinci argümanını değerlendirmez. Arg sırası, ikisi arasında tersine çevrilir.
Başka bir farklılık:
push
elemanı listenin başına ekler .
add-to-list
Listenin başına veya sonuna öğe eklemenizi sağlar .
(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")
Gönderen Emacs belgelerine veya C-h f push
:
Makro: push öğe listesi adı
Bu makro, arabası öğe olan ve cdr'ı liste adıyla belirtilen liste olan yeni bir liste oluşturur ve bu listeyi liste adına kaydeder.
Aynı sayfadan veya C-h f add-to-list
:
İşlev: listeye ekle sembol öğesi ve isteğe bağlı ekleme-fn ekleme
Bu işlev, öğeyi zaten bu değerin bir üyesi değilse, öğeyi eski değere uygulayarak değişken sembolünü ayarlar.
Bu nedenle, add-to-list
yalnızca öğe zaten orada değilse iter.
cl-pushnew
gibi davranır add-to-list
.
add-to-list
kodu dönüştürmekte zorlanıyordumcl-pushnew
ve bu blog gönderisini oldukça aydınlatıcı buldum: yoo2080.wordpress.com/2013/09/11/…