2013-03-26 39 views
0

我新手试图遍历2列出了并行,这样的:遍历2列出了并行CLISP

(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))) 

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

回答

2

我不能确定你想要做的事情,但是这个修改你的代码修复无限循环:

(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,并且循环按照您的预期遍历列表。

+0

我明白你说的,我虽然不知道*做什么。这只是一个小错误(应该是temp1而不是l1),这导致我的其他大功能永无止境。 – David 2013-03-26 21:42:26

1

(循环为在 '(ABCDE) 为沿y' ×(1 2 3 4 5) 收集(列表XY))

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