2016-11-25 100 views
2

我想在CL中實現一個基本的嵌套循環,但循環宏正在抵制這種循環。基本上,我想找到所有可能的3位數字產品並將其累積到列表中。在Common Lisp中使用循環宏的嵌套循環

這裏是我的嘗試:

(loop for x downfrom 999 to 998 do (loop for y downfrom 999 to 998 collect (* x y))) 

上面的代碼返回NIL出於某種原因。順便說一下,我意識到我只能運行到998,但這是爲了測試目的而完成的。

我能做什麼來獲得這樣的名單:

(999 * 999 * 999 ... 998 998 * 998 * 998 ... 997 * 997 997 997 * 996 ... 100 * 100)

+1

彼得·塞貝爾給LOOP的概述:http://www.gigamonkeys.com/book/loop-for-black-belts.html –

回答

6

COLLECT-clause在內部循環中不影響外部循環。因此,內部循環返回結果列表,但外部循環中的條款僅放棄結果。您應該使用APPENDNCONC而不是DO。如果沒有性能問題,通常最好堅持APPEND,即使在這種情況下,NCONC也是安全的。

(loop for x downfrom 999 to 900 
     append (loop for y downfrom 999 to 900 
        collect (* x y))) 
+0

魔術!非常感激! – MadPhysicist

+0

我仍然習慣於閱讀CL的文檔,他們有時可能會感到困惑。 – MadPhysicist

+3

@MadPhysicist w.r.t. CLHS LOOP頁面,這是一個_mild_輕描淡寫,不是。 :) –