2011-12-14 66 views
6

我使用嵌套plist創建對象結構(CLOS類型),將嵌套對象傳遞給它的部分。我想以迭代方式追加嵌套plist,但是因此我想要在時間和內存方面高效地完成。Common Lisp:有效地添加嵌套plist

下面的例子說明,由於該δ到一個迭代:

'(:airframer "Boeing" :type "777" :wing-plist ((:side :left :winglet? nil) 
               (:side :right :winglet? nil))) 

'(:airframer "Boeing" :type "777" :wing-plist ((:type :main-wing :side :left) 
               (:type :main-wing :side :right) 
               (:type :stabilizer :size :left))) 

我已經讀了載體的使用,而不是名單可以幫助,如您訪問元素沒有太多很多處罰:Replace an item in a list in Common Lisp?。但是,我真的很想繞過矢量的使用。

此外,我認爲使用破壞性的功能會節省內存,並希望計算時間。

這就是我現在要解決的問題,但我覺得它不夠高雅。功能fill用於破壞性。

(defun append-nested-plist (plist key sub-plist) 
    (let* ((key-pos (position key plist))) 
    (fill plist (append (getf plist key) (list sub-plist)) 
      :start (+ key-pos 1) :end (+ key-pos 2)))) 

我期待着您的回答。

回答

3

這個怎麼樣?

(defun append-nested-plist (plist key sub-plist) 
    (push-to-end sub-plist (getf plist key)) 
    plist) 

推至端是一種常用定義宏這不是普通口齒不清標準的一部分:

(defmacro push-to-end (item place) 
    `(setf ,place (nconc ,place (list ,item))))