Elisp:如何推回列表

Elisp: How to push-back to a list

有没有办法在 elisp 中返回列表?

我找到的最接近的是

(add-to-list 'myList myValue t) ;; t tells it to put to back of the list

但是,问题在于添加到列表会强制执行唯一性。另一种选择是 (push 'myList myVal) 但它只能推到列表的前面。我尝试使用 (cons myList myVal) 但 IIRC returns 不是列表。

唯一有效的是

(setq myList (append myList (list myVal)))

但是这种语法很可怕,感觉做一些简单的事情需要做很多额外的工作。

有没有更快的方法推到列表的最后面。正如 (add-to-list) 中所见,这显然是可能的,但是有没有办法在不强制唯一性的情况下做到这一点?

换句话说,像 C++ 和 <List> class

Lisp 列表与其他语言中的 "lists"

Lisp 列表是 cons 单元链 ("linked lists"),不是像 C 中那样的专门的顺序容器,也不是像 Perl 和 Python 中那样奇怪的列表和向量的混合。

这种漂亮的方法允许将相同的方法应用于 codedata,创建一种 可编程的编程语言.

Lisp 没有 "push-back" 函数的原因是

  • 不需要它:-)
  • 定义不是很明确

不需要

添加到末尾与列表的长度成线性关系,所以,对于 积累,标准模式是结合 push 迭代和 nreverse 完成后。

定义不明确

add-to-list 使用 symbol 作为参数是有原因的(这使得它对编程毫无用处)。

添加到空列表时会发生什么? 您需要修改存储列表的地方

当列表与另一个对象共享结构时会发生什么? 如果你使用

(setq my-list (nconc my-list (list new-value)))

所有其他对象也被修改。

如果你像你建议的那样写,

(setq my-list (append my-list (list new-value)))

您将在每次添加时分配 (length my-list) 个单元格。

试试这个:

(defun prueba ()
  (interactive)
  (let ((mylist '(1 2 3)))
    (message "mylist -> %s" mylist)
    (add-to-list 'mylist 1 t)
    (message "mylist -> %s" mylist)
    (setq mylist '(1 2 3))
    (add-to-list 'mylist 1 t '(lambda (a1 a2) nil))
    (message "mylist -> %s" mylist)
    ))

添加一个总是 returns nil 作为 add-to-list 的第四个参数的比较函数允许你 添加重复项。