我使用嵌套的plist来创建对象结构(CLOS类型),将嵌套的对象传递给它的部分。我想以迭代的方式附加嵌套的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))))
我期待着你的回答。
答案 0 :(得分:3)
这个怎么样?
(defun append-nested-plist (plist key sub-plist)
(push-to-end sub-plist (getf plist key))
plist)
Push-to-end是一个常见的宏,不属于常见的lisp标准:
(defmacro push-to-end (item place)
`(setf ,place (nconc ,place (list ,item))))