有没有办法推回到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>
类
答案 0 :(得分:7)
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
的第四个参数的比较函数,您可以
添加重复项。