如何有效地设置一个结构(另一个结构)的单个字段?

时间:2016-02-09 07:32:39

标签: emacs structure elisp

(cl-defstruct cache
  (owner (make-person))
  (folder (make-hash-table)))

(cl-defstruct person
  (name "")
  (phone ""))

(setq foo (make-cache))

(setf (cache-owner foo) (make-person :name "me" :phone "00000000"))
(let ((folder (cache-folder foo)))
  (puthash "/foo/" "20160201" folder)
  (puthash "/download/foo/" "20160101" folder)
  (setf (cache-folder foo) folder))

这是一个最小的例子。 在此示例中,缓存包含两个元素。一个是另一个结构,一个是哈希表。这就是我当前更改单个元素的方式。

然而,我觉得它效率极低。

首先,即使我只想更改电话号码,我也需要建立一个新人。小结构很好。但是,如果人是一个除了姓名和电话之外还有许多其他领域的批量结构,那么将会有相当大的开销。

我使用的另一种方法是创建一个局部变量来临时保存结构。然后它被写回结构。它似乎更好但效率仍然低,因为它涉及复制整个结构并写回整个结构。

有没有更好的方法来完成这项工作?

1 个答案:

答案 0 :(得分:1)

  

首先,即使我只想更改电话号码,我也需要建立一个新人。小结构很好。但是,如果人是一个除了姓名和电话之外还有许多其他领域的批量结构,那么将会有相当大的开销。

您只需更改电话号码即可创建新的“人员”结构。您可以使用Input : 2015-07-01 00:50:00,2015-07-01 00:00:00, returns : 0 更改它:

setf
  

我使用的另一种方法是创建一个局部变量来临时保存结构。然后它被写回结构。它似乎更好但效率仍然低,因为它涉及复制整个结构并写回整个结构。

通常,在Emacs Lisp中,除非您要求复制它,否则不会复制任何内容。特别是,在上面的代码示例中,(setf (person-phone p) "111111") 调用操作缓存结构中的哈希表,最终的puthash是多余的。