在这个问题中,我有三个(结构相同的)列表。两个是所有数字,另一个是 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/