首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在common-lisp中,如何就地将元素插入列表?

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

Stack Overflow用户
提问于 2010-12-08 20:46:49
回答 2查看 12.8K关注 0票数 7

两个问题:

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

代码语言:javascript
复制
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单元格是通过值传递的,所以它是通过值传递的,因此更改它的car只会更改一辆复制车,而不会更改原始汽车,尽管后面的cons单元格是共享的,并且可以就地更改。我说的对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-08 21:56:11

1)如下所示:

代码语言:javascript
复制
(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细胞进行破坏性修改:

代码语言:javascript
复制
(setf testy-list '(a bar))
(defun modify (list)
  (setf (first list) 'foo))
(modify testy-list)
testy-list   => (FOO BAR)

这会将第一个cons单元格的car设置为“foo”。

票数 15
EN

Stack Overflow用户

发布于 2017-05-18 04:54:04

我为我的一个项目做了这个,处理索引0,如果索引大于列表的长度,新的项被附加到列表的末尾。请注意,它会创建一个新列表,因此它可能不适用于您。我把它收录进来,希望它能对某些人有用。

代码语言:javascript
复制
(defun list-insert-at (lst index new-value)
  (let ((retval nil))
    (loop for i from 0 to (- (length lst) 1) do
      (when (= i index)
        (push new-value retval))
      (push (nth i lst) retval))
    (when (>= index (length lst))
      (push new-value retval))
    (nreverse retval)))

CL-USER> test
(1 2 3 4 5)
CL-USER> (list-insert-at test 5 'a)
(1 2 3 4 5 A)
CL-USER> (list-insert-at test 0 'a)
(A 1 2 3 4 5)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4387570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档