Bunun gibi iki özellik listesini birleştirmek için standart Elisp kütüphane işlevi bulamadık:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Bununla bir şeyler inşa edebilirim dolist
, ama yapmadan önce, bazı kütüphanelerde var olan bir işleve bakmadığımı kontrol etmek istiyorum.
Yorumlara dayalı güncellemeler :
- "Çok yönlü" yoruma yanıt olarak:
Ben soruya farklı (ve muhtemelen geçerli) cevaplar var çünkü böyle bir işlev olmadığını hayal ediyorum: farklı değerlerle yinelenen özellik adları olduğunda ne yapmalı?
Evet, kopyaları nasıl birleştireceğinizle ilgili bir soru var, ancak bunu ele almanın nispeten az yolu var. İki genel yaklaşım görüyorum. İlk olarak, argüman sırası kopyaları çözebilir; Clojure'un birleşmesinde olduğu gibi en sağda kazanır . İkincisi, birleştirme, Ruby'nin birleştirmesinde olduğu gibi, kullanıcı tarafından sağlanan geri arama işlevine devredilebilir .
Her durumda, bunu yapmanın farklı yolları olması, diğer birçok dil standart kütüphanesinin bir birleştirme işlevi sağlamasını engellemez. Aynı genel argüman sıralamada da söylenebilir, ancak Elisp sıralama işlevi sunar.
- "Detaylandırabilir misin?" / "Lütfen tam olarak aradığınız davranışı belirtin."
Genel olarak konuşmak gerekirse, Elisp topluluğunun kullandığı şeylere açıkım. Belirli bir örnek istiyorsanız, işinize yarayacak bir örnek aşağıdadır:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
Ve geri dönüyor
'(k1 1 k2 2 k3 0))
Bu, Clojure'un birleşmesi gibi, en çok kazanılan bir stil olacaktır.
- "Bunlar listeler, yani eklensin mi?"
Hayır, özellik listesi semantiğini append
korumaz . Bu:
(append '(k1 1 k2 2) '(k2 0))
Bunu döndürür:
(k1 1 k2 2 k2 0)
append, C kaynak kodunda yerleşik bir fonksiyondur.
(SEQUENCES ekleyin ve dinlenin)
Tüm argümanları birleştirin ve sonucu bir liste yapın. Sonuç, öğeleri tüm bağımsız değişkenlerin öğeleri olan bir listedir. Her argüman bir liste, vektör veya dize olabilir. Son argüman kopyalanmaz, sadece yeni listenin kuyruğu olarak kullanılır.
- "Ve örneğin birleştirme gibi bir şey göstermiyor - iki özellik listesi bile göstermiyor."
Evet öyle; birleştirmeyi adım adım yapar. Elisp'in belgelenmiş özellik listesi işlevlerini kullanarak birleştirme yapmanın acı verici bir şekilde nasıl ayrıntılı olduğunu gösterir:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Ortaya çıkan çıktı değerini aşağıdakilerden görüntülemeniz yeterlidir pl
:
(key-1 value-1 key-2 value-2)
Tekrarlamak gerekirse, bu sorunu çözmek için bir işlev yazabiliyorum, ama önce böyle bir işlevin ortak kullanımda bir yerde olup olmadığını anlamak istedim.
Son olarak, soruyu belirsiz bulduğunuz için aşağı düşürdüyseniz, açıklığa kavuşturmak için biraz çaba harcadığımı şimdi tekrar düşünmenizi rica ediyorum. Bu araştırma eksikliği değil. "Listeler" deki Elisp dokümanları soruya cevap vermiyor.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
bu (:a 3 :b 2 :a 1)
sadece pliste erişmek için plist işlevlerini kullandığınız sürece aynıdır .
plist-get
ne plist-member
birden fazla özdeş tuşları varsa umurumda. Onlar bu konuda alists benzer şekilde davranırlar anlaşılıyor: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Bu arada, (plist-put '(:a "a" :b "b" :a "c") :a "d")
birinci :a
anahtarın değerini değiştirir ancak ikincisinin değerini değiştirmez .
append
?