common-lisp - 在 common-lisp 中,如何就地将元素插入到列表中?

标签 common-lisp

两个问题:

1.我想要一个函数在列表中就地插入一个元素(在列表的开头以外的任何位置,原因请参见问题2),这样:

CL> (defun insert-in-place (the-list after-position new-element) .... ) => ...
CL> (setf testy-list (list 'a 'b 'c 'd)) => ...  
CL> testy-list => ('A 'B 'C 'D)  
CL> (insert-in-place testy-list 1 'BOOOO) => ...  
CL> testy-list => ('A 'B 'BOOOO 'C 'D)

2.我认为通过函数将元素就地插入到列表的开头是不可能的,因为args是按值传递的,所以由于列表的第一个cons单元格被传递,它是按值传递的,它是一个副本等改变它的汽车只会改变一个副本汽车,而不是原始的,尽管以下缺点单元是共享的,并且可以就地更改。我对么?

最佳答案

1)这里是:

(defun insert-after (lst index newelt)
  (push newelt (cdr (nthcdr index lst))) 
  lst)
(insert-after '(a c d) 0 'b)   => (A B C D)

2) cons 细胞的破坏性修饰:
(setf testy-list '(a bar))
(defun modify (list)
  (setf (first list) 'foo))
(modify testy-list)
testy-list   => (FOO BAR)

这将第一个 cons 单元的 car 设置为 'foo.

关于common-lisp - 在 common-lisp 中,如何就地将元素插入到列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4387570/

相关文章:

lisp - 如何运行为 Digitool 4.3 (2003) 编写的算法?

list - 是否可以在duplicate()函数中限制调用cons函数的次数?

string - Common Lisp 中字符串和数字的核心区别是什么?

list - Lisp:给定级别 k 上的节点列表

lisp - 将列表中的每个项目加倍,同时限制 Lisp 中的 cons 调用

common-lisp - ASDF 抛出系统过时条件

lisp - 关于 LISP 中关于格式函数的语句的解释

lisp - 如何在普通 lisp 中将 double-float 转换为字节数组,反之亦然?

performance - 使用 expt-mod 函数的 Lisp 性能问题

data-structures - 什么时候以及为什么要在 CL 中使用哈希表而不是 a-lists?