【问题标题】:Elisp: How to push-back to a listElisp:如何推回列表
【发布时间】:2017-04-04 14:45:02
【问题描述】:

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

我找到的最接近的东西是

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

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

唯一有效的是

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

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

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

换句话说,像 C++ 和 <List> 类这样的一个很好的旧推回函数

【问题讨论】:

  • 作为后续问题,为什么 elisp 如此稀疏。我觉得它只是工作所需的最低限度。这背后有某种哲学吗?
  • 它是一个 Lisp,例如一种可扩展的语言。如果有什么事情让你烦恼并改变行为,你总是可以编写一个宏。

标签: lisp elisp


【解决方案1】:

Lisp 列表与其他语言中的“列表”

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

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

Lisp 没有“推回”功能的原因是

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

不需要

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

定义不明确

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

当您添加到一个空列表时会发生什么? 您需要修改存储列表的位置

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

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

所有其他对象也都被修改了。

如果你按照你的建议写,

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    (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 的第四个参数的比较函数允许您 添加重复项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多