2010-08-03 9 views
7

C'è un modo semplice in Common Lisp per unire due plists? O da un altro punto di vista: c'è un modo per rimuovere i duplicati da un plist? So che posso semplicemente aggiungere dei plists (e GETF prenderà il primo che trova), ma non vorrei continuare ad accumulare chiavi inutilizzate mentre la mia app funzionava.Un modo semplice per unire i plists?

Sto pensando a qualcosa come (loop for p on my-plist by #'cddr ...), ma c'è spesso un modo più semplice del mio primo pensiero!

+0

Come si desidera gestire chiavi duplicate con valori diversi? Una delle liste ha la precedenza? – Svante

+3

Il modo più semplice per rimuovere i duplicati da un plist è iniziare con 'make-hash-table' ... –

risposta

5

Si potrebbe cominciare da questa versione primitiva:

(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

Non hai bisogno di' progn' dopo il 'do'. :) – Svante

+3

@Svante, lo so. A volte lo sto usando per rendere il gruppo di espressioni standout. È anche una funzione di sintassi che a volte trovo sconcertante per il lettore umano: le espressioni si estendono fino alla fine. MENTRE NON. –