2010-08-03 6 views
7

Czy w Common Lisp jest łatwy sposób na połączenie dwóch plistów? Lub z innego punktu widzenia: czy istnieje sposób na usunięcie duplikatów z plist? Wiem, że mogę tylko dodać plists (i GETF zajmie pierwszą znalezioną), ale nie chciałbym gromadzić nieużywanych kluczy podczas mojej aplikacji.Łatwy sposób na połączenie plists?

Myślę o czymś takim, jak (loop for p on my-plist by #'cddr ...), ale często jest łatwiejszy sposób niż moja pierwsza myśl!

+0

Jak chcesz obsługiwać zduplikowane klucze z różnymi wartościami? Czy jedna z list ma pierwszeństwo? – Svante

+3

Najprostszym sposobem na usunięcie duplikatów z plist jest rozpoczęcie 'make-hash-table' ... –

Odpowiedz

5

Można zacząć od tej pierwotnej wersji:

(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

Nie potrzebujesz' progn' po 'zrobić'. :) – Svante

+3

@Svante, wiem. Czasami używam go, aby grupa wyrażeń była wyjątkowa. Jest to również funkcja składni, którą czasem zastanawiam się nad ludzkim czytelnikiem: wyrażenia DO rozciągają się do końca. GDYŻ NIE. –