如何将多个元素附加到Emacs lisp中的列表

时间:2014-06-22 22:33:39

标签: list emacs elisp

在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 :以前我认为重复过滤会很好,但事实并非如此。我确实需要重复。

4 个答案:

答案 0 :(得分:5)

这几乎等同于 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))

1 append不会复制最终元素,而是直接将其用作新列表的尾部,因此该部分是相同的。但是,如果对原始列表对象(或其某些部分)有其他引用,那么 将是复制该列表(通过append)和仅扩展它之间的功能差异(与setcdr)。当然,你真正想要的那两个结果中的哪一个取决于你。

答案 1 :(得分:5)

我的init文件中有以下内容,允许添加多个元素。我不知道循环添加的项目有多高效,但它可以防止重复的元素。

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

答案 2 :(得分:2)

如果您不在乎订购:

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

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

答案 3 :(得分:0)

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

(setq list1 (-union list1 list2))