2010-08-03 4 views
7

Есть ли простой способ в Common Lisp объединить два слоя? Или с другой точки зрения: есть ли способ удалить дубликаты из plist? Я знаю, что могу просто добавить plists (и GETF возьмет первый, который он найдет), но я бы не хотел сохранять накопленные неиспользуемые ключи, поскольку мое приложение работает.Легкий способ слияния пластин?

Я думаю о чем-то вроде (loop for p on my-plist by #'cddr ...), но часто есть более простой способ, чем моя первая мысль!

+0

Как вы хотите обрабатывать дубликаты ключей с разными значениями? Имеет ли один из списков приоритет? – Svante

+3

Самый простой способ удалить дубликаты из plist - начать с 'make-hash-table' ... –

ответ

5

Вы могли бы начать с этой примитивной версии:

(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

Вам не нужно' progn' после 'do'. :) – Svante

+3

@Svante, я знаю. Иногда я использую его, чтобы сделать группу выражений отличной. Это также синтаксическая функция, которую я нахожу иногда загадочной для человеческого читателя: выражения DO расширяются до конца. ПОЗДРАВЛЯЕМ. –

Смежные вопросы