Elisp:如何推回列表

时间:2017-04-04 14:45:03

标签: lisp elisp

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

我发现最接近的是

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

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

唯一有效的是

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

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

是否有更快的方法来推送到列表的后面。如(add-to-list)所示,它显然是可能的,但有没有办法在不强制执行唯一性的情况下实现这一目标?

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

这样的旧的推回函数

2 个答案:

答案 0 :(得分:7)

Lisp列出vs&#34;列表&#34;用其他语言

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

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

Lisp没有&#34;推回的原因&#34;功能就是那个

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

不需要

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

定义不明确

add-to-list有一个symbol作为参数的原因(这使得编程无效)。

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

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

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

所有其他对象也被修改。

如果您按照建议书写,

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

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

答案 1 :(得分:0)

尝试一下:

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

添加一个始终返回nil作为add-to-list的第四个参数的比较函数,您可以 添加重复项。