【问题标题】:How to append multiple elements to a list in Emacs lisp如何在 Emacs lisp 中将多个元素附加到列表中
【发布时间】:2014-08-12 22:20:53
【问题描述】:

在 Emacs lisp 中有 add-to-list 将单个元素添加到列表中(如果它不存在的话)。

我想添加多个元素,而不是一个。另外,我不想过滤重复的元素,但仍将它们添加到列表中。

目前,我实现了以下功能:

(defun append-to-list (list-var elements)
  "Append ELEMENTS to the end of LIST-VAR.

The return value is the new value of LIST-VAR."
  (set list-var (append (symbol-value list-var) elements)))

该函数可以满足我的要求,但我想知道 Emacs lisp 中是否已经存在类似(或更好)的东西。我不想重新发明轮子。

更新 1:Stefan 在下面指出此代码不适用于词法范围。有没有办法让它工作?

更新 2:以前我认为重复过滤会很好,但事实并非如此。我确实需要副本。

【问题讨论】:

  • 你的代码没问题。没有类似的系统功能。
  • 我不会将其描述为“很好”,但是是的,它会起作用。使用symbol-valueset 意味着它不能与词法范围的变量一起使用。除非您真的需要它,否则最好在开头添加elements,因为elements 几乎总是比list-var 短(有时短得多)。
  • 有没有办法让代码使用词法作用域?

标签: list emacs elisp


【解决方案1】:

这几乎等同于1,但速度更快,因为它不会在添加新元素之前复制原始列表。

(defun append-to-list (list-var elements)
  "Append ELEMENTS to the end of LIST-VAR.

The return value is the new value of LIST-VAR."
  (unless (consp elements)
    (error "ELEMENTS must be a list"))
  (let ((list (symbol-value list-var)))
    (if list
        (setcdr (last list) elements)
      (set list-var elements)))
  (symbol-value list-var))

1append 不复制最终元素,而是直接将其用作新列表的尾部,因此该部分是相同的。但是,如果有对原始列表对象(或其某些部分)的额外引用,那么在复制该列表(通过append)和仅扩展它(使用@ 987654324@)。当然,您真正想要的这两种结果中的哪一种取决于您自己。

【讨论】:

  • 如果原始列表为零则打嗝!
  • 哦。固定的。谢谢斯特凡。
  • 至少在我当前的用例中,我不保留引用。所以这对我来说看起来更干净,因为它避免了复制。谢谢!但它可以与词法作用域一起使用吗?
  • 不,当list-var 参数是symbol 时,你不能用词法作用域来做到这一点,因为这样做你已经失去了对词法值的访问权.您必须传递列表 value 并直接对其进行操作。
【解决方案2】:

我的初始化文件中有以下内容,允许添加多个元素。我不知道循环添加要添加的项目的效率如何,但它可以防止重复元素。

(defun jlp/add-to-list-multiple (list to-add)
  "Adds multiple items to LIST.
Allows for adding a sequence of items to the same list, rather
than having to call `add-to-list' multiple times."
  (interactive)
  (dolist (item to-add)
    (add-to-list list item)))

【讨论】:

  • 这行不通,因为我确实需要列表中的重复值。
  • 如果需要复制,可以使用push代替add-to-list
【解决方案3】:

如果您不关心订购:

(setf var (cl-list* elt1 elt2 elt3 var))

list* 的最后一个参数成为结果列表的尾部。

【讨论】:

    【解决方案4】:

    如果要过滤重复元素,也可以使用dash.el

    (setq list1 (-union list1 list2))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多