Push ve listeye ekle arasındaki fark nedir?


26

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.


1
Kullanarak kodu kullanarak add-to-listkodu dönüştürmekte zorlanıyordum cl-pushnewve bu blog gönderisini oldukça aydınlatıcı buldum: yoo2080.wordpress.com/2013/09/11/…
dangom

Yanıtlar:


21

#Zck'in bahsettiği şey bir farktır. Ama tek fark bu olsaydı, o zaman cl-pushnewve hakkında sorabilirsiniz add-to-list.

Bir diğer önemli fark: add-to-listbir fonksiyondur, yani bütün argümanlarını, özellikle ilkini değerlendirir. pushbir 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-listdiyor 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'.

6
Ayrıca bayt-derleyiciye göre:add-to-list can't use lexical var ...; use push or cl-pushnew
Malabarba

(push (5 6) my-list)hala bana bir hata veriyor - 5bir işlev değil. Bu add-to-listdavranışından nasıl farklı ?
markasoftware

@ markasoftware: Ne yapmaya çalışıyorsun? Listeyi yere itmek istiyorsanız (5 6)(değişkenin değeri) my-listo 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). pushArgümanı değerlendirir.
Drew

@ Argümanı değerlendirdiğini şimdi söylediniz, ancak cevabınız kelimenin tam anlamıyla, kafamın kaynağını oluşturan “ilk argümanı değerlendirmediğini” belirtiyor.
markasoftware

@ markasoftware: Üzgünüm; Bir yazım hatası vardı - "ikinci argümanı" yazmam gereken "ilk argümanı" yazdım. Şimdi düzeltildi - teşekkürler. İkinci argüman pushdeğ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-listdeğeri güncellendiğinde değişkeni üretmek için ilk argümanını değerlendirir. pushgüncellenecek değişken olan ikinci argümanını değerlendirmez. Arg sırası, ikisi arasında tersine çevrilir.
Drew

15

Başka bir farklılık:

pushelemanı listenin başına ekler .

add-to-listListenin 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")

14

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-listyalnızca öğe zaten orada değilse iter.


cl-pushnewgibi davranır add-to-list.
Sam Boosalis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.