2010-08-03 71 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