2010-08-03 75 views
7

Common Lisp中有一种简单的方法来合并两个plists吗?或者从另一个角度来看:有没有办法从plist中删除重复项?我知道我可以追加plists(并且GETF将会找到它找到的第一个),但是我希望在应用程序运行时不要累积未使用的键。简单的方法来合并plists?

我正在考虑像(loop for p on my-plist by #'cddr ...)这样的东西,但通常比我的第一个想法更简单!

+0

你想怎么处理重复键具有不同的价值观?其中一个列表是否优先? – Svante 2010-08-03 16:45:19

+3

从plist删除重复项的最简单方法是以'make-hash-table'开始...... – 2010-08-04 02:54:09

回答

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

在'do'之后不需要'progn'。 :) – Svante 2010-08-12 13:19:40

+3

@Svante,我知道。有时我会用它来使这组表达式脱颖而出。这也是一种语法功能,我觉得有时令读者困惑不已:DO表达式延伸到了最后。尽管不。 – 2010-08-12 17:56:42