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*ループ内のステートメントの1つを検討してください。

(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 に答える