gpt4 book ai didi

nested - 通用 Lisp : Appending a nested plist efficiently

转载 作者:行者123 更新时间:2023-12-04 15:36:21 37 4
gpt4 key购买 nike

我使用嵌套 plist 来创建对象结构(CLOS 类型),将嵌套的对象传递给它的部分。我想以迭代方式 append 嵌套的 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))))

我期待着您的回答。

最佳答案

这个怎么样?

(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))))

关于nested - 通用 Lisp : Appending a nested plist efficiently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8505172/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com