Elisp:如何推回列表

Cam*_*ron 4 lisp elisp

有没有办法推回到elisp中的列表?

我发现最接近的是

(add-to-list 'myList myValue t) ;; t tells it to put to back of the list
Run Code Online (Sandbox Code Playgroud)

但问题是,"添加到列表"会强制实施唯一性.另一种选择是,(push 'myList myVal)但只能推到列表的前面.我尝试使用(cons myList myVal)IIRC而不是列表.

唯一有效的是

(setq myList (append myList (list myVal)))
Run Code Online (Sandbox Code Playgroud)

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

是否有更快的方法来推送到列表的后面.这显然是可能的(add-to-list),但有没有办法在不强制执行唯一性的情况下做到这一点?

换句话说,一个很好的旧回推功能,如C++和<List>

sds*_*sds 7

Lisp列出了vs其他语言的"列表"

Lisp列表是cons细胞链("链表"),不像C中那样是专门的顺序容器,而不是像Perl和Python那样奇怪的列表和向量混合.

这种漂亮的方法允许将相同的方法应用于代码数据,从而创建可编程的编程语言.

Lisp没有"推回"功能的原因是

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

没必要

添加到列表的长度是线性的,因此,对于累积,标准模式是push在迭代和 nreverse完成时组合 .

没有明确定义

有一个原因add-to-list可以将a symbol作为参数(这使得编程无用).

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

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

(setq my-list (nconc my-list (list new-value)))
Run Code Online (Sandbox Code Playgroud)

所有其他对象也被修改.

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

(setq my-list (append my-list (list new-value)))
Run Code Online (Sandbox Code Playgroud)

你将(length my-list)在每次添加时分配单元格.