Common Lisp中有一种简单的方法来合并两个plists吗?或者从另一个角度来看:有没有办法从plist中删除重复项?我知道我可以追加plists(并且GETF将会找到它找到的第一个),但是我希望在应用程序运行时不要累积未使用的键。简单的方法来合并plists?
我正在考虑像(loop for p on my-plist by #'cddr ...)
这样的东西,但通常比我的第一个想法更简单!
Common Lisp中有一种简单的方法来合并两个plists吗?或者从另一个角度来看:有没有办法从plist中删除重复项?我知道我可以追加plists(并且GETF将会找到它找到的第一个),但是我希望在应用程序运行时不要累积未使用的键。简单的方法来合并plists?
我正在考虑像(loop for p on my-plist by #'cddr ...)
这样的东西,但通常比我的第一个想法更简单!
你可以从这个原始的版本开始:
(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)
在'do'之后不需要'progn'。 :) – Svante 2010-08-12 13:19:40
@Svante,我知道。有时我会用它来使这组表达式脱颖而出。这也是一种语法功能,我觉得有时令读者困惑不已:DO表达式延伸到了最后。尽管不。 – 2010-08-12 17:56:42
你想怎么处理重复键具有不同的价值观?其中一个列表是否优先? – Svante 2010-08-03 16:45:19
从plist删除重复项的最简单方法是以'make-hash-table'开始...... – 2010-08-04 02:54:09