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

 暮迟_MCz_P 发布于 2023-01-08 10:16

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

2 个回答
  • 我在我的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)))
    

    2023-01-08 10:18 回答
  • 这几乎相当于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不会复制最终元素,而是直接将其用作新列表的尾部,因此该部分是相同的.但是,如果存在对原始列表对象(或其某些部分)的附加引用,则在复制该列表(via )和仅扩展它(with )之间存在功能差异.当然,你真正想要的那两个结果中的哪一个取决于你.appendsetcdr

    2023-01-08 10:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有