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 中那样奇怪的列表和向量的混合。
这种漂亮的方法允许将相同的方法应用于 code 和 data,创建一种 可编程的编程语言.
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
的第四个参数的比较函数允许你
添加重复项。
有没有办法在 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 中那样奇怪的列表和向量的混合。
这种漂亮的方法允许将相同的方法应用于 code 和 data,创建一种 可编程的编程语言.
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
的第四个参数的比较函数允许你
添加重复项。