【问题标题】:Common Lisp: Appending a nested plist efficientlyCommon Lisp:有效地附加嵌套的 plist
【发布时间】:2012-01-20 06:26:25
【问题描述】:

我使用嵌套 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))))

期待您的回答。

【问题讨论】:

    标签: nested plist append common-lisp


    【解决方案1】:

    这个怎么样?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-21
      • 2021-12-25
      • 2012-12-11
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      相关资源
      最近更新 更多