0

我是新手,试图并行迭代 2 个列表,如下所示:

(defun test-do* (l1 l2)
  (do* ((temp1 l1 (cdr l1))
        (var1 (car temp1) (car temp1))
        (temp2 l2 (cdr l2))
        (var2 (car temp2) (car temp2)))
       ((endp temp1) 'end-of-l1) ))

问题是我的代码中有一个无限循环,我不知道为什么。您的帮助将不胜感激。

4

2 回答 2

3

我不确定您到底要做什么,但是对代码的这种修改修复了无限循环:

(defun test-do* (l1 l2)
  (do* ((temp1 l1 (cdr temp1))
        (var1 (car temp1) (car temp1))
        (temp2 l2 (cdr temp2))
        (var2 (car temp2) (car temp2)))
       ((endp temp1) 'end-of-l1) ))

考虑do*循环中的语句之一:

(temp1 l1 (cdr l1))

翻译成英语(在do*循环的上下文中),这意味着:“这不是你想要的,因为 的值l1永远不会改变,因此temp1在第一次之后的每次迭代中都分配相同的值。考虑这个修改:

(temp1 l1 (cdr temp1))

这意味着:“在第一次迭代中,设置temp1为 的值l1。在每个后续迭代中,设置temp1为 的值(cdr temp1)。” 这样,temp1每次迭代的值取决于上一次迭代的值temp1,并且您的循环会按照您的预期逐步遍历列表。

于 2013-03-26T21:32:37.857 回答
3

(循环 for x in '(abcde) for y in '(1 2 3 4 5) collect (list xy) )

((A 1) (B 2) (C 3) (D 4) (E 5))

于 2015-12-11T15:54:28.590 回答