2013-03-26 42 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))