common-lisp - Lisp-遍历列表并替换值

标签 common-lisp

在这个问题中,我有三个(结构相同的)列表。两个是所有数字,另一个是 nil .我正在尝试通过添加两个列表中的相应值来替换空列表中的相应值。到目前为止,我使用的是循环并使用 setf来替换值。

(defun add-two-lists (list1 list2 list3)
   (loop for a in list1
        for b in list2
        for c in list3 do
        (setf c (+ a b))))

问题是这个函数没有破坏性。如何使此功能具有破坏性?

好的,我知道我可以使用 apply这样做,但为了将来或切线目的,有没有办法使用循环来做同样的事情?

我决定求助于我的倒数第二个解决方案;使用列表长度横向列表。
(defun add-two-lists (list1 list2 list3)
       (loop for x from 0 to (- (list-length list1) 1) do
            (setf (nth x list3) (+ (nth x list1) (nth x list2))))
       (values list3))

最佳答案

这是一种方法:

(defun add-two-lists (list1 list2 list3)
   (loop for a in list1
        for b in list2
        for c on list3 do
        (rplaca c (+ a b)))

附录

这是使用 map 而不是 loop 的另一种方式:
(defun add-two-lists (list1 list2 list3)
  (mapl #'(lambda (cl al bl) (rplaca cl (+ (car al) (car bl))))
    list3 list1 list2))

关于common-lisp - Lisp-遍历列表并替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001029/

相关文章:

lisp - 如何将特殊运算符应用于列表?

common-lisp - 指示符的性质是什么?

lisp - 我可以将Common Lisp用于SICP还是Scheme是唯一的选择?

docker - 在 Docker 镜像中安装 Quicklisp 库

lisp - common-lisp 中更好的 pythonic `join`

lisp - 不使用 nthcdr 获取列表的第 n 个 cdr

functional-programming - 过程和组合器之间的区别?

linux - 在 Linux 上安装 lispbuilder-SDL 时出现问题。 - "Don' t 知道如何要求 ASDF-INSTALL"

lisp - 带有 progn 的 Lisp 中的嵌套 IF 语句

lisp - 如何使 Allegro Common Lisp 区分大小写?