合并plists的简单方法?

时间:2010-08-03 16:31:50

标签: lisp plist common-lisp

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

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

1 个答案:

答案 0 :(得分: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)