2010-08-03 16 views
7

Gibt es einen einfachen Weg in Common Lisp, um zwei Plisten zusammenzuführen? Oder aus einem anderen Blickwinkel: Gibt es eine Möglichkeit, Duplikate aus einem Pliste zu entfernen? Ich weiß, dass ich nur Plisten anhängen kann (und GETF wird das erste finden, das es findet), aber ich möchte nicht immer ungenutzte Schlüssel sammeln, während meine App läuft.Einfache Möglichkeit, Plisten zu verbinden?

Ich denke über etwas wie (loop for p on my-plist by #'cddr ...) nach, aber es gibt oft einen einfacheren Weg als mein erster Gedanke!

+0

Wie Sie doppelte Schlüssel mit unterschiedlichen Werten zu handhaben wollen? Hat eine der Listen Vorrang? – Svante

+3

Der einfachste Weg, um Duplikate aus einem Plist zu entfernen, ist, mit 'make-hash-table' zu ​​beginnen ... –

Antwort

5

Sie sind von dieser primitiven Version beginnen könnten:

(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

Sie brauchen nicht' progn' nach dem 'do'. :) – Svante

+3

@Svante, ich weiß. Manchmal benutze ich es, um die Gruppe von Ausdrücken hervorzuheben. Es ist auch eine Syntax-Funktion, die ich manchmal für den menschlichen Leser rätselhaft finde: DO-Ausdrücke erstrecken sich bis zum Ende. Während nicht. –

Verwandte Themen