2010-08-03 33 views
7

¿Hay alguna manera fácil en Common Lisp para unir dos plists? O desde otro punto de vista: ¿hay alguna manera de eliminar duplicados de un plist? Sé que puedo agregar listas (y GETF tomará la primera que encuentre), pero me gustaría no seguir acumulando claves no utilizadas a medida que se ejecuta mi aplicación.¿Manera fácil de combinar listas?

Estoy pensando en algo como (loop for p on my-plist by #'cddr ...), ¡pero a menudo hay una manera más fácil de lo que había pensado!

+0

¿Cómo quiere manejar claves duplicadas con diferentes valores? ¿Una de las listas tiene prioridad? – Svante

+3

La manera más fácil de eliminar duplicados de un plist es comenzar con 'make-hash-table' ... –

Respuesta

5

Usted podría comenzar a partir de esta versión 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

No necesita' progn' después del 'do'. :) – Svante

+3

@Svante, lo sé. A veces lo estoy usando para resaltar el grupo de expresiones. También es una característica de sintaxis que a veces me resulta desconcertante para el lector humano: las expresiones DO se extienden hasta el final. MIENTRAS NO. –

Cuestiones relacionadas