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