2010-08-03 21 views
7

Common Lisp'te iki plists birleştirmek için kolay bir yolu var mı? Ya da başka bir bakış açısından: kopyaları bir plisten çıkarmak için bir yol var mı? Sadece plist ekleyebileceğimi biliyorum (ve GETF ilk bulduğu şeyi alacaktır), fakat uygulamada olduğu gibi kullanılmayan anahtarları biriktirmek istemiyorum.Plists birleştirmek için kolay yolu?

(loop for p on my-plist by #'cddr ...) gibi bir şey hakkında düşünüyorum, ancak ilk düşüncemden daha kolay bir yol var!

+0

? Listelerden biri öncelikli mi? – Svante

+3

Çoğaltmaları bir plisten kaldırmanın en kolay yolu, "make-hash-table" ile başlayacaktır ... –

cevap

5
Bu ilkel sürümden başlayabileceğini

: Farklı değerlerle yinelenen anahtarlar ele istiyoruz Nasıl

(defun merge-plist (p1 p2) 
    (loop with notfound = '#:notfound 
     for (indicator value) on p1 by #'cddr 
     when (eq (getf p2 indicator notfound) notfound) 
     do (progn 
      (push value p2) 
      (push indicator p2))) 
    p2) 

CL-USER 104 > (merge-plist '(a 1 b 2 c 3) '(a 2 b 4)) 
(C 3 A 2 B 4) 
+0

'do'dan sonra' progn 'seçeneğine ihtiyacınız yoktur. :) – Svante

+3

@Svante, biliyorum. Bazen ifadeler grubunu öne çıkarmak için kullanıyorum. Aynı zamanda insan okuyucusu için bazen şaşırtıcı buluyorum bir sözdizimi özelliği: DO ifadeler sonuna kadar uzanır. Yapmadığı zaman. –

İlgili konular